[英]Program crashing when trying to read a vector of objects
我有一個帶有vector of objects
的以下類。當我使用該類對象讀取向量的值時,程序崩潰。我什至試圖放入try block
,但控件沒有進入catch block
。
這本書課:
class Book
{
public:
char isbn[11];
char name[50];
char author_name[50];
char pub_name[50];
char edition[10];
float cost;
char dept[10];
int count;
char id[8];
};
這是Library類,其中包含vector of class Book
的vector of class Book
class Library
{
public:
char l_name[50];
char admin_name[50];
int phone_no;
char location[50];
vector<Book> v;
};
這是主要功能
int main()
{
Library lib; //LIBRARY OBJECT
Book b; //BOOK OBJECT
fstream fp("library1.bin",ios::in | ios::binary); //OPEN FILE IN READ MODE
if(!fp) cout<<"reading failed...";
try
{
fp.read(reinterpret_cast<char *>(&lib),sizeof(lib)); //READ LIBRARY DETAILS
if(fp.bad() == true) cout<<"Read failure..."<<endl;
fp.close();
cout<<"Enter ISBN number:"; cin>>b.isbn; //READ ISDN NUMBER FROM USER
for(int i=0;i<lib.v.size();i++) //CHECK WHETHER BOOK ALREADY EXISTS
{
Book b1 = lib.v[i];
if(strcmp(b1.isbn,b.isbn) == 0)
{
lib.v[i].count++;
}
}
}
catch(exception& e) //CATCH ANY EXCEPTIONS
{
cout<<"Error:"<<e.what()<<endl;
}
catch(...) //CATCH ANY UNCAUGHT EXCEPTIONS
{
cout<<"Unknown error occured:";
}
}
當我試圖檢查ISDN號碼時,程序崩潰。
包含vector
的基礎數據的內存不會存儲在vector
類本身中,而只會存儲指向它的指針。
因此,當您執行fstream::read
,您將使用指向內存中某個隨機位置的指針來初始化此vector
( vector
數據在寫入時位於該位置,很可能無法訪問或數據已經消失了,除非您這樣做)。在程序當前運行期間將其寫入,並且該vector
仍在范圍內),因此,任何訪問數據的嘗試都將導致不確定的行為。
我建議您不要嘗試直接使用fstream::read
還原類,因為要使其工作起來可能會有點困難(更不用說它附帶的許多可能的問題),而是編寫/讀取成員從文件到文件一一對應。
您的示例中可能缺少一些代碼,但是我懷疑問題是您在向量上使用[]
而不使用大小調整構造函數, resize
或push_back
來實際增加向量的大小。
您不能使用istream::read
讀取向量,必須使用循環並分別讀取每個向量項目。
出於同樣的原因,您不應該使用ostream::write
編寫向量。 盡管它可以正常工作而不會崩潰,但是它不會對文件寫入任何有用的信息。 同樣,您應該使用循環將向量中的每個項目分別寫入。 最好也先寫出向量的大小,這樣一來,當您讀回向量時,就會知道向量中有多少個項目。
換句話說,C ++中的二進制I / O並不像您想象的那么簡單。 您還有更多工作要做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.