Сохранение и загрузка class в бинарный файл

oifgk

Здравствуйте, подскажите пожалуйста, как сохранить и загрузить бинарный файл. Через С++/CLI Windows Form Пытался сериализацию, но в С++ с этим трудности, на С# нашел как сделать,но перевести на С++ не смог, может знаете как это реализовать, очень надо.
public class Student
{
private:
    char name[100];
    char number[100];
    int kurs;
    char group[100];
    int prball;
    int ball;
 
public:
    Student();
    Student(char in_name[], char in_number[], int in_kurs, char in_group[], int in_prball, int in_ball);
    void setName(char in_name[]);
    void setNumber(char in_number[]);
    void setGroup(char in_group[]);
    void setKurs(int in_kurs);
    void setPrball(int in_prball);
    void setBall(int in_ball);
    char* getName();
    char *getNumber();
    int getKurs();
    char *getGroup();
    int getPrball();
    int getBall();
};
extern bool type;
extern int NUM;
extern std::list<Student*> studentList;//хранит всех студентов
extern std::list<Student*>::iterator it;
3 ответа

oifgk

Так сериализация через .net или же C++ родным способом надо? Просто для .net все массивы нужно будет привести к типу array<[Type]>, перед class ref прописать, атрибут(ы) добавить и отказаться от стандартных классов хранения данных (в std библиотеке).


oifgk

Sklifosofsky, мне бы хоть как это сделать, мои попытки не увенчались успехом


oifgk

#include <fstream>
using namespace std;
    //запись
    ofstream fout("C:\\data.bin", std::ios_base::binary | std::ios_base::trunc);
    
    if (!fout.is_open()){
        return 1; //ошибка открытия файла (для консольки)
    }
 
    int sz = sizeof(Student); //размер данных класса
 
    for (list<Student*>::iterator i(studentList.begin()), e(studentList.end()); i != e; ++i)
    {
        fout.write((char*)*i, sz);
    }
 
    fout.close();
    //чтение
    ifstream fin("C:\\data.bin", std::ios_base::binary);
    int sz = sizeof(Student); //размер данных класса
    
    while (!fin.eof())
    {
        Student *s = new Student;
        fin.read((char*)s, sz);
        studentList.push_back(s);
    }
 
    fin.close();
Вам осталось поправить и распихать все это в функции... ПробуйтеИ еще. У вас в листе указатели. Перед очисткой листа не забудьте освободить память из под указателей