I'm new here so forgive me if I make some mistakes. Anyway, I've got this code here:
class List{
private:
int dim;
Reservations *res; //Dynamic array of reservations that composes "List"
public:
List();
List(int dm, Reservations *resv);
~List();
int getDim();
void setDim(int dm);
void readNwrite(List &ls);
};
This is a class and I need to write and read the Reservations array in a binary file. The Reservations class is composed of other types of data (two strings, an integer and also another class). Here you can see the Reservations class:
class Reservations{
private:
DateTime dt;
string name, phone;
int codVisit;
public:
Reservations();
Reservations(DateTime datT, string nm, string tel, int cod);
~Reservations();
DateTime getDt();
void setDt(DateTime datT);
string getName();
void setName(string nm);
string getTel();
void setTel(string tel);
int getCodVisit();
void setCodVisit(int cod);
void read();
void print();
};
And here's the class DateTime:
class DateTime{
private:
Date d;
int sec, min, hrs;
public:
DateTime();
DateTime(int s, int m, int o, int d, int ms, int y);
~DateTime();
void getDt();
void setDt(int g, int ms, int y);
int getSec();
void setSec(int s);
int getMin();
void getMin(int m);
int getOre();
void getOre(int o);
void print();
void read();
int validate();
int compare(DateTime dt1);
friend void Anglform(DateTime dt);
};
This is how I've done created and read the binary file in the List class:
void List::readNwrite(List &ls){
ofstream file("list.dat", ios::binary);
file.write(reinterpret_cast<char*>(res), sizeof(Reservations) * dim);
file.close();
ifstream fileF("list.dat", ios::binary);
ls.setDim(dim);
ls.res = new Reservations[ls.dim];
fileF.read(reinterpret_cast<char*>(ls.res), sizeof(Reservations) * dim);
file.close();
}
I've tried it but it isn't working. I know that the second instance is getting the contents of the first one, but in the end the program always crashes...
CodePudding user response:
To be able to read/write a structure to/from a file as a binary blob, that structure must be standard layout type (aka POD) and not contain any pointers within. Your structure obviously does not satisfy that requirement (std::string
object is not a standard layout type and does contain a pointer(s) inside) so you have to write reading/writing methods to load/store data member by member or use a library designed for that purpose.
Note: your class Reservations
violates the rule of 3/5/0
and you have memory leak right there on this line:
ls.res = new Reservations[ls.dim];
You better use std::vector
for dynamic array or if you cannot at least a smart pointer.