0

我有下面的类,它有一个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

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 号码时,程序崩溃了。

4

3 回答 3

2

包含 a 的基础数据的内存vector不存储在vector类本身中,只存储了指向它的指针。

fstream::read因此,vector当您vector执行.并且vector仍在范围内),因此任何访问数据的尝试都将导致未定义的行为。

我建议您不要尝试直接使用 恢复您的课程fstream::read,因为让它工作可能有点困难(更不用说随之而来的许多可能的问题),而是一个一个地写入/读取成员/来自文件。

于 2013-08-29T16:08:00.443 回答
1

您的示例中可能缺少一些代码,但我怀疑问题是您[]在向量上使用而不使用大小调整构造函数resize,或push_back实际增加向量的大小。

于 2013-08-29T15:59:21.217 回答
0

您不能使用istream::read来读取向量,您必须使用循环并单独读取每个向量项。

出于同样的原因,您不应该使用ostream::write来编写向量。虽然它可以在不崩溃的情况下工作,但它不会向文件写入任何有用的东西。同样,您应该使用循环单独写入向量中的每个项目。首先写下向量的大小可能也很有帮助,因此当您回读它时,您会知道向量中有多少项目。

换句话说,C++ 中的二进制 I/O 并不像您想象的那么简单。你还有一点工作要做。

于 2013-08-29T16:19:54.737 回答