(C++) 将动态数组写入和读取到二进制文件
(C++) Writing and reading a dynamic array to a binary file
我是新来的所以如果我有什么错误请原谅我。
不管怎样,我这里有这段代码:
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);
};
这是一个 class,我需要在二进制文件中写入和读取 Reservations 数组。 Reservations class 由其他类型的数据组成(两个字符串,一个整数和另一个 class)。
在这里您可以看到预订 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();
};
这是 class 日期时间:
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);
};
这就是我创建和读取列表中的二进制文件的方式 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();
}
我试过了,但没有用。我知道第二个实例正在获取第一个实例的内容,但最后程序总是崩溃...
为了能够 read/write 结构 to/from 文件作为二进制 blob,该结构必须是 standard layout type(又名 POD)并且其中不包含任何指针。您的结构显然不满足该要求(std::string
对象不是标准布局类型并且内部确实包含一个指针)因此您必须将 reading/writing 方法写入 load/store 数据成员由会员或使用为此目的设计的图书馆。
注意:您的 class Reservations
违反了 the rule of 3/5/0
你在这条线上有内存泄漏:
ls.res = new Reservations[ls.dim];
你最好使用 std::vector
动态数组,或者如果你不能至少使用智能指针。
我是新来的所以如果我有什么错误请原谅我。 不管怎样,我这里有这段代码:
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);
};
这是一个 class,我需要在二进制文件中写入和读取 Reservations 数组。 Reservations class 由其他类型的数据组成(两个字符串,一个整数和另一个 class)。 在这里您可以看到预订 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();
};
这是 class 日期时间:
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);
};
这就是我创建和读取列表中的二进制文件的方式 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();
}
我试过了,但没有用。我知道第二个实例正在获取第一个实例的内容,但最后程序总是崩溃...
为了能够 read/write 结构 to/from 文件作为二进制 blob,该结构必须是 standard layout type(又名 POD)并且其中不包含任何指针。您的结构显然不满足该要求(std::string
对象不是标准布局类型并且内部确实包含一个指针)因此您必须将 reading/writing 方法写入 load/store 数据成员由会员或使用为此目的设计的图书馆。
注意:您的 class Reservations
违反了 the rule of 3/5/0
你在这条线上有内存泄漏:
ls.res = new Reservations[ls.dim];
你最好使用 std::vector
动态数组,或者如果你不能至少使用智能指针。