Как и вообще возможно ли сохранить объект класса в файл
Как и вообще возможно ли сохранить объект класса в файл целиком
fin.write((char*)&obj, sizeof(class)); тут как я понимаю работать не будет
Класс объект которого нужно сохранить
ниже классы которые используются
class Plane
{
public:
Plane()=default;
~Plane() = default;
std::string getNumber() const { return number; }
std::string getBrand()const { return brand; }
std::string getReleaseDate()const { return releaseDate; }
double getCarrying()const { return carrying; }
size_t getPassengersCount()const { return passengersCount; }
friend std::istream& operator>>(std::istream& in, Plane&);
friend std::ostream& operator<<(std::ostream& out, const Plane&);
void changeItem();
private:
std::string number;
std::string brand;
std::string releaseDate;
int carrying;
int passengersCount;
};
class Pilot
{
public:
Pilot() = default;
~Pilot() = default;
std::string getSurname()const { return surname; }
size_t getworkExperienceYears() const { return workExperienceYears; }
std::string getAddress()const { return address; }
std::string getDateOfBirth()const { return DateOfBirth; }
double getSalary()const { return salary; }
friend std::istream& operator>>(std::istream& in, Pilot&);
friend std::ostream& operator<<(std::ostream& out, const Pilot&);
void changeItem();
private:
std::string surname;
size_t workExperienceYears;
std::string address;
std::string DateOfBirth;
double salary;
};
class Flight
{
public:
Flight() = default;
~Flight() = default;
void setPilotandPlane(Pilot& pi, Plane& pl) { pilot = pi, plane = pl; pilotSurname = pi.getSurname(), planeNumber = pl.getNumber(), planeBrand = pl.getBrand(), cargoWeight = pl.getCarrying(); }
void changeItem();
std::string getflightNumber()const { return flightNumber; }
std::string getFinishDate()const { return finishDate; }
std::string getStartDate() const { return startDate; }
std::string getPilotSurname()const { return pilotSurname; }
std::string getPlaneNumber()const { return planeNumber; }
std::string getPlaneBrand() const { return planeBrand; }
double getKm()const { return km; }
double getCost()const { return cost; }
std::string getStartPoint()const { return startPoint; }
std::string getFinishPoint() const { return finishPoint; }
size_t getCountOfStops() const { return countOfStops; }
size_t getCountOfSoldTickets() const { return countOfSoldTickets; }
size_t getCargoWeight() const { return cargoWeight; }
Pilot& getPilot() { return pilot; };
Plane& getPlane() { return plane; };
friend std::istream& operator>>(std::istream& in, Flight& flight);
friend std::ostream& operator<<(std::ostream& out, const Flight& flight);
protected:
Pilot pilot;
Plane plane;
std::string flightNumber;
std::string finishDate;
std::string startDate;
std::string pilotSurname;
std::string planeNumber;
std::string planeBrand;
double km;
double cost;
std::string startPoint;
std::string finishPoint;
size_t countOfStops;
size_t countOfSoldTickets;
size_t cargoWeight;
};
Ответы (2 шт):
Для того, чтобы сохранить класс в файл, необходимо упаковать содержимое класса так, чтобы при чтении данных можно было восстановить его на любой системе с различными порядками байт. Этот процесс называется сериализацией, соответственно восстановление класса из упакованных данных называется десериализацией.
В С++ "из коробки" не предусмотрено механизма сериализации, но есть много сторонних библиотек, позволяющих это сделать. Самые известные - это:
Компонента библиотеки boost - Serialization.
Целиком не получится, потому что vector и string хранят в себе указатель на память в куче. При записи будут записываться именно указатели, а не данные. Чтобы записать string в бинарный файл, необходимо сначала записать количество симолов (т.е. size() строки), а потом записать это количество символов. Также и для vector. Сначала реализуйте функции для записи классов компонентов, а потом скомпонуйте эти функции внутри функции записи класса агрегатора.
Вот код записи обьекта класса Plane:
size_t str_size = number.size() + 1;
file.write(reinterpret_cast<char*>(&str_size), sizeof(size_t));
file.write(reinterpret_cast<char*>(number.c_str()), str_size);
str_size = brand.size() + 1;
file.write(reinterpret_cast<char*>(&str_size), sizeof(size_t));
file.write(reinterpret_cast<char*>(brand.c_str()), str_size);
str_size = releaseDate.size() + 1;
file.write(reinterpret_cast<char*>(&str_size), sizeof(size_t));
file.write(reinterpret_cast<char*>(releaseDate.c_str()), str_size);
file.write(reinterpret_cast<char*>(&carrying), sizeof(int));
file.write(reinterpret_cast<char*>(&passengersCount), sizeof(int));