@jspie

Как сделать сохранение/загрузку данных из бинарного файла через классы?

Есть класс Students.
class Students{
public:

	void save();
	void load();

	~Students();

	//Конструктор класса Students
	Students(string firstname, string lastname);

	//Установка имени
	void set_firstname(string);
	//Получение имени
	string get_firstname();

	//Установка фамилии
	void set_lastname(string);
	//Получение фамилии
	string get_lastname();

private:
	//Имя
	string firstname;
	//Фамилия
	string lastname;
};

Сам конструктор:
Students::Students(string firstname, string lastname)
{
	Students::set_firstname(firstname);
	Students::set_lastname(lastname);
}


С сохранением вроде разобрался:
void Students::save() {
	ofstream fout("Students.dat", ios::binary | ios::out);
	
	string firstname = Students::get_firstname();
	string lastname = Students::get_lastname();

	fout.write((char*)&lastname, sizeof(firstname));
	fout.write((char*)&lastname, sizeof(lastname));

	fout << std::endl;
	fout.close();
}

Но с загрузкой возникли проблемы. Сама форма обращается к Main.cpp, логика в этом файле Там я обращаюсь уже к Students.h.
Задача стоит такая: Нужно загрузить список студентов (из бинарного файла) Изменить любого студента и сохранить его в тот же файл. Как я понял нужно загружать в файл массив Students, далее после редактирования какого либо элемента массива - возвращать новый массив и записывать в файл.
Сам вопрос заключается в том, как это сделать через классы, конструкторы и декструктор? Как грамотно это реализовать?
Описание конструкторов и функции класса находятся в файле Students.cpp. Логика программы в Main.cpp
  • Вопрос задан
  • 255 просмотров
Пригласить эксперта
Ответы на вопрос 1
nekipelov
@nekipelov
> fout.write((char*)&lastname, sizeof(firstname));

Вы записываете в файл внутренне содержимое класса. Так нельзя. Если нужно записать строку, пишите так:

fout.write(lastname.data(), firstname.size());

Но ведь вам потом ее надо будет прочитать. А для этого надо знать ее размер, значит надо так:

size_t size = firstname.size();
fout.write(reinterpret_cast<const char *>(&size), sizeof(size));
fout.write(lastname.data(), size);


Соответственно потом читать сначала размер, а потом size байт. Но гораздо проще взять www.boost.org/doc/libs/1_64_0/libs/serialization/doc/, это позволит избежать множества граблей. Там есть все средства для работы с массивами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы