Запись string в бинарый файл . С++

175
31 декабря 2020, 02:10

Нужна помощь.

У меня есть класс с полями типа: 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;
}

В результате работы программы выскакивает ошибка.

Answer 1

Этот вопрос обсуждался, но раз вы спрашиваете как, а не почему :), то примерно так:

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... но главное, надеюсь, ясно?

READ ALSO
Сборка проекта из под Windows в Linux

Сборка проекта из под Windows в Linux

Очень нужно собрать проект (библиотеки и исполняемые файлы) на Qt в виндовсе на линуксНашел в интернете про сборку с линукса на виндовс, но ничего...

96
С++: приведение типов

С++: приведение типов

Подскажите пожалуйста один вопросик (что-то совсем из головы вылетело):

116
Узнать конец динамического массива

Узнать конец динамического массива

Как можно узнать размер динамического массива, например int* или как получить указатель на его конец

125