我是新來的,所以如果我犯了一些錯誤,請原諒我。無論如何,我在這里有這個代碼:
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);
};
這是一個類,我需要在二進制檔案中寫入和讀取 Reservations 陣列。Reservations 類由其他型別的資料(兩個字串、一個整數和另一個類)組成。在這里你可以看到 Reservations 類:
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();
};
這是 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);
};
這是我在 List 類中創建和讀取二進制檔案的方式:
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();
}
我試過了,但它不起作用。我知道第二個實體正在獲取第一個實體的內容,但最終程式總是崩潰......
uj5u.com熱心網友回復:
為了能夠以二進制 blob 的形式從檔案中讀取/寫入結構,該結構必須是標準布局型別(又名 POD)并且其中不包含任何指標。您的結構顯然不滿足該要求(std::string物件不是標準布局型別并且內部確實包含一個指標),因此您必須撰寫讀/寫方法來逐個加載/存盤資料成員或使用為此設計的庫目的。
注意:您的課程Reservations違反了 3/5/0 的規則,
并且您在這一行出現了記憶體泄漏:
ls.res = new Reservations[ls.dim];
您最好使用std::vector動態陣列,或者如果您不能至少使用智能指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397311.html
上一篇:在C中將陣列作為引數傳遞
