(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 动态数组,或者如果你不能至少使用智能指针。