c++用二进制文件读/写对象

C++ reading/writing objects with binary files

本文关键字:对象 二进制文件 c++      更新时间:2023-10-16

我花了几个小时的时间试图修复二进制文件操作的问题。

任务是读写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

有趣的是,有时程序运行得很好,而且有时它在第一次从文件中读取图书时崩溃。

然而,每当程序成功读取一些内容时,和我不修改书,然后重新打开程序,程序保持完美运行。

似乎什么都不起作用。请帮助!

您的问题是,您的BookStoreBook类的某些部分包含指针,即使它们是不可见的。例如,std::string有一个指向存储字符串内容的内存位置的指针。

当c++中的数据结构出现在内存中时,将它们写入磁盘实际上总是被认为是一种不好的做法。这样做没有考虑不同机器的不同端序,不同机器上的字宽(intlong在32位和64位机器上的大小可能不同),并且您会遇到所有指针问题。

您应该将BookStoreBook的每个字段沿

的行推入输出流。
file << book.isbn << ' ';
file << book.title << ' ';
...

请注意,以上是非常糟糕的做法,因为解码变得非常困难。我建议你使用Boost。序列化,或者编写自己的方法,可以从文件中读取/写入键值对,或者您可能想要查看jsoncpp或tinyxml2。整个主题可能会变得相当复杂,所以坚持使用Boost是个好主意,即使只是为了弄清楚如何自己解决这个问题(假设这是一个家庭作业)。