Чтение структуры из бинарного файла [дубликат]

90
08 января 2021, 13:10
На этот вопрос уже дан ответ здесь:
Ошибка сохранения сложной структуры в файле (1 ответ)
Закрыт 1 год назад.

У меня есть структура

    struct CarInfo
{
    string brand;
    string color;
    string licensePlate;
    string fullName;
};

Я хочу прочитать из бинарного файла все записи структур и вывести их на экран, потом дописать в конец файла структуру и снова вывести на экран, это всё делается через функции. после вывода на экран программа зависает и завершается: (процесс 8720) завершает работу с кодом -1073741819. Вызвано необработанное исключение: нарушение доступа для чтения. _Pnext было 0xD507DC.

Функция выглядит вот так:

void showAllRecords(string direction, fstream &file, CarInfo item)
{
    vector<CarInfo> recordForOut(numberOfRecords(direction, file, item));
    int i = 0; bool t =  false;
    int countOfRecords = numberOfRecords(direction, file, item);
    file.open(direction, ios::binary | ios::in | ios::out);
    while (i < recordForOut.size())
    {
        file.read(reinterpret_cast<char*>(&item), sizeof(item));
        recordForOut[i] = item;
        i++;
    }
    file.seekg(0);
    file.close();
    for (int j = 0; j < recordForOut.size(); j++)
    {
        cout << "\n" << j + 1 << " item\n";
        cout << "brand " << recordForOut[j].brand;
        cout << "\ncolor " << recordForOut[j].color;
        cout << "\nfull name " << recordForOut[j].fullName;
        cout << "\nlicense plate " << recordForOut[j].licensePlate << "\n\n";
    }
}

Пробовал разные варианты, независимо от них всё время появляется одна и та же ошибка.

Answer 1

Если Вам необходимо хранить именно в бинарном виде, как уже было сказано в комментариях

объекты std::string не являются POD типами и запись их байт является неопределенным поведением

В связи с этим Вам необходимо либо воспользоваться уже существующими сериализаторами, например protobuf или boost.serrialization, или написать свой.

READ ALSO
Консольная программа на C++ с использованием UNICODE

Консольная программа на C++ с использованием UNICODE

Проблема в приведении типов при попытке написать код для WinAPIПрограмма простенькая, для вывода таблицы умножения

121
Проверка слов строки на наличие буквы, на которую кончается и начинается

Проверка слов строки на наличие буквы, на которую кончается и начинается

Дана строка, состоящая из символов латинского алфавита, разделенных пробелами (одним или несколькими)Определить количество слов, которые...

102
Label с HyperLink

Label с HyperLink

У меня есть QLabel, его размер 400x400 и в тексте прописано:

110
C++ Вытащить из Char цифры, написанные через пробел

C++ Вытащить из Char цифры, написанные через пробел

есть char b[50] = "11 2 6" или он может быть записан char b[50] = "1 23 6"

119