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

250
10 апреля 2017, 07:19

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

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

Присвоение итераторов

Предположим, у меня есть std::vector<int> vec1 размера nТакже есть RandomAccessIterator begin и end, которые принадлежат другому вектору vec2 такого же размера

254
Поиск самого длинного слова в строке. С++

Поиск самого длинного слова в строке. С++

Нужно найти самое длинное слово в строкеBAЖНО! Без класса string! проблема в том что код, не работает

371
Шаблонная функция

Шаблонная функция

Есть шаблонная функция:

235
Ошибка при выделении памяти в Си (Access violation)

Ошибка при выделении памяти в Си (Access violation)

Здравствуйте, возникла проблема при выполнении программы

269