Нужна помощь.
У меня есть класс с полями типа: string, int и float;
Как мне занести данные даного класса в бинарный файл?
Пример кода:
class foo
{
string Name;
int Age;
public:
void show()
{
cout << "Name = " << Name << endl;
cout << "Age = " << Age << endl;
}
};
int main()
{
foo obj("Something Name", 10);
foo obj2;
ofstream file("file.bin", ios::binary | ios::app);
file.write((char *)(&obj), sizeof(obj));
file.close();
ifstream file2("file.bin", ios::binary);
file2.read((char *)(&obj2), sizeof(obj2));
file2.close();
obj2.show();
return 0;
}
В результате работы программы выскакивает ошибка.
Ответ
Этот вопрос обсуждался, но раз вы спрашиваете как, а не почему :), то примерно так:
class foo
{
string Name;
int Age;
public:
void show()
{
cout << "Name = " << Name << endl;
cout << "Age = " << Age << endl;
}
void write(ostream& os)
{
os.write((char*)&Age, sizeof(Age)); // Запись POD-члена
size_t len = Name.length()+1; // Длина с нулевым байтом
os.write((char*)&len, sizeof(len)); // Запись длины
os.write((char*)Name.c_str(),len); // Запись данных
}
void read(istream& in)
{
in.read((char*)&Age,sizeof(Age)); // Чтение POD-члена
size_t len; // Переменная для длины
in.read((char*)&len, sizeof(len)); // Чтение длины записанной строки
char * buf = new char[len]; // Выделение буфера для чтения
in.read(buf,len); // Чтение (с нулевым байтом)
Name = buf; // Присвоение считанной строки члену
delete[]buf; // Освобождение памяти
}
};
А дальше -
ofstream file("file.bin", ios::binary | ios::app);
obj.write(file);
Ну и, соответственно, read
Это - наброски без проверки ошибок, попроще - чтоб была понятна идея. Можно читать прямо в строку, функцию write нужно сделать константной etc etc... но главное, надеюсь, ясно?
Комментариев нет:
Отправить комментарий