簡體   English   中英

嘗試讀取對象向量時程序崩潰

[英]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 Bookvector 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 ,您將使用指向內存中某個隨機位置的指針來初始化此vectorvector數據在寫入時位於該位置,很可能無法訪問或數據已經消失了,除非您這樣做)。在程序當前運行期間將其寫入,並且該vector仍在范圍內),因此,任何訪問數據的嘗試都將導致不確定的行為。

我建議您不要嘗試直接使用fstream::read還原類,因為要使其工作起來可能會有點困難(更不用說它附帶的許多可能的問題),而是編寫/讀取成員從文件到文件一一對應。

您的示例中可能缺少一些代碼,但是我懷疑問題是您在向量上使用[]而不使用大小調整構造函數, resizepush_back來實際增加向量的大小。

您不能使用istream::read讀取向量,必須使用循環並分別讀取每個向量項目。

出於同樣的原因,您不應該使用ostream::write編寫向量。 盡管它可以正常工作而不會崩潰,但是它不會對文件寫入任何有用的信息。 同樣,您應該使用循環將向量中的每個項目分別寫入。 最好也先寫出向量的大小,這樣一來,當您讀回向量時,就會知道向量中有多少個項目。

換句話說,C ++中的二進制I / O並不像您想象的那么簡單。 您還有更多工作要做。

暫無
暫無

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

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