簡體   English   中英

(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 數組。 保留 class 由其他類型的數據(兩個字符串,一個 integer 和另一個類)組成。 在這里您可以看到預訂 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();
}

我已經嘗試過了,但它不起作用。 我知道第二個實例正在獲取第一個實例的內容,但最后程序總是崩潰......

為了能夠將結構作為二進制 blob 讀取/寫入文件,該結構必須是 標准布局類型(又名 POD),並且其中不包含任何指針。 您的結構顯然不滿足該要求( std::string object 不是標准布局類型,並且確實包含內部指針),因此您必須編寫讀/寫方法以按成員加載/存儲數據成員或使用為此目的而設計的圖書館。

注意:您的 class Reservations違反了 3/5/0 規則,並且您在此行有 memory 泄漏:

ls.res = new Reservations[ls.dim];

您最好將std::vector用於動態數組,或者如果您至少不能使用智能指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM