#include <fstream>
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
class akh {
public:
char name[20];
int age;
};
int main() {
akh ak;
cout << "Size of ak:" << sizeof(ak) << endl;
fstream fout("abc.dat", ios::binary | ios::out);
cout << "\nEnter your name: ";
cin.getline(ak.name, 20);
cout << "\nEnter your age: ";
cin >> ak.age;
fout.write((char*) &ak, sizeof(ak));
fout.close();
fstream fin("abc.dat", ios::in | ios::binary);
fin.read((char*)&ak, sizeof(ak)); // automatically puts name in ak.name and age in ak.age ? How is this happening?
cout << "\nName: " << ak.name;
cout << "\nAge: " << ak.age;
fin.close();
return 0;
}
- How is this happening?
Вы записываете полную схему памяти класса akh
в двоичный файл как есть.
Поэтому, если вы прочитаете его таким же образом и с тем же количеством байтов, у вас будет такая же структура памяти в экземпляре ak
.
- After closing the file, tellg pointer automatically moves to the beginning of the file?
Нет, указатель tellg
больше не поддерживается после вызова close()
.
Для ввода вы открываете новый экземпляр fstream
fin
, который начинает чтение с начала файла.
- Is there any other method to read and write in binary file except ((char*)&x,sizeof(x))??
Для бинарных файлов нет. Как упоминалось ранее, вы хотите записать и прочитать точное количество байтов, как они размещены в памяти.
Если вы хотите, чтобы символы в текстовом файле были удобочитаемы, используйте операторы форматированного текста <<
для вывода и >>
для ввода.
Когда я запускаю ваш код, ваша проблема становится ясной. Используемый вами вариант std::getline()
принимает ровно 20 символов от входа в ak.name
:
cin.getline(ak.name, 20);
Вы можете исправить это, заменив указанную выше строку на
cin >> ak.name;
и при вводе ставьте пробел между именем и возрастом.
Здесь - это решение, в котором все работает по назначению и показывает структуру памяти вашего двоичного файла.