Сохранение класса (с членом Vector) в виде двоичного файла в C ++ - PullRequest
1 голос
/ 21 февраля 2020

Я пытаюсь сохранить и загрузить класс Student, используя двоичные файлы. Вот как выглядят классы:

class Student{
    char name[100];
    int regno;
    vector<Subjects> subjects;
};

class Subjects{
    char initial;
    int id;
};

Я сохраняю и загружаю таким образом:

void saveFile(){
    fstream f1;
    f1.open("data.bin", ios::out | ios::binary);
    f1.write((char*)&student, sizeof(Student));
    f1.close();
}

void loadFile(){
    fstream f1;
    f1.open("data.bin", ios::in | ios::binary);
    f1.read((char*)&student, sizeof(Student));
    f1.close();
}

Ничего особенного, как вы можете видеть с сохранением и загрузкой, но я проверял это через операторы print, и это - векторный компонент, вызывающий cra * sh при запуске его в терминале (cmd.exe).

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Вы не можете просто сохранить и загрузить объект, если не сериализуете объект Student перед сохранением его в файл.

Обоснование:

класс Student это не тип POD. std::vector<Subjects> в вашем Student классе просто содержит указатель на базовую память, которая содержит Subjects, поскольку vector использует кучу для хранения своего содержимого. Когда вы сохраняете объект в файл, вы просто сохраняете указатель вместе с объектом Student, но не фактические данные. Поэтому, когда вы пытаетесь воссоздать тот же объект из сохраненных двоичных данных, вы просто получаете доступ к адресу памяти, а не к фактическому содержимому.

В мире C ++ boost::serialization, Protocol buffers и cereal наиболее известные ( * но не ограничиваясь ) библиотеки сериализации для достижения того, что вы пытаетесь сделать.

0 голосов
/ 21 февраля 2020

std::vector не является типом POD .

std::vector выделенной динамической c памяти и хранит указатель где-то внутри. Когда вы записываете его в файл, вы просто записываете заголовок в эту динамическую c память, которая равна std::vector. Когда вы читаете его снова, он больше не является действительным указателем, и вы получаете cra sh.

...