【发布时间】:2014-06-20 22:16:02
【问题描述】:
我花了好几个小时试图解决二进制文件操作的问题。
任务是从二进制文件读取和写入 BookStoreBook 对象
BookStoreBook 类包含以下成员变量:
string isbn;
string title;
Author author;
string publisher;
Date dateAdded;
int quantityOnHand;
double wholesaleCost;
double retailPrice;
看书的代码如图:
fstream file("inventory.txt", ios::binary | ios::in | ios::out);
vector<BookStoreBook> books:
BookStoreBook *book = (BookStoreBook *)new char[sizeof(BookStoreBook)];
file.read((char*)book, sizeof(BookStoreBook));
while (!file.eof())
{
books.push_back(*book);
file.read((char*)book, sizeof(BookStoreBook));
}
写书的代码如图:
vector<BookStoreBook> writeBooks = library.getBooks(); //library contains books
file.close();
file.open("inventory.txt", ios::out | ios::binary);
for(int i = 0; i < writeBooks.size(); i++)
{
BookStoreBook *book = (BookStoreBook *)new char[sizeof(BookStoreBook)];
book = &writeBooks[i];
file.write((char*)book, sizeof(BookStoreBook));
file.clear();
}
file.clear();
file.close();
我不想将任何字符串转换为 c_str(),因为这在分配要求中是被禁止的。
一些注意事项:
当我运行程序时,程序会尝试从文件中读取书籍,并且 那是当我们得到一个 Windows 错误窗口时,稍后当我调试时,我得到以下消息: FinalProject.exe 中 0x56b3caa4 (msvcr100d.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x0084ef10
有趣的是,有时程序运行得很好,而且 有时它在第一次从文件中读取书籍时会崩溃。
但是,只要程序成功读取了某些内容,并且 我不修改书籍,然后重新打开程序,程序保持 完美运行。
似乎没有任何效果。请帮忙!
【问题讨论】:
-
你想在调试器中运行你的程序。
-
当您的方法序列化指针时,您将序列化指针本身,而不是指向的内容。这就是这里发生的事情,如果
string意味着std::string。 -
实际上,我通过 Visual Studio 调试器收到了该错误消息
-
Author 和 Date 的类是什么样的?
-
BookStoreBook 不是 POD,因为它继承了一个包含虚函数的类,并且有一个构造函数
标签: c++ binaryfiles