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

时间:2014-06-20 22:16:03

标签: c++ binaryfiles

我已经花了好几个小时试图解决二进制文件操作的问题。

任务是从二进制文件读取 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

     

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

     

但是,只要程序成功读取了一些内容,并且   我不修改书籍,然后重新打开程序,程序保持   跑得很好。

似乎没什么用。请帮忙!

1 个答案:

答案 0 :(得分:4)

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

在C ++中将数据结构写入内存时,实际上一直认为这是一种不好的做法。这样做不会考虑不同机器的不同字节顺序,不同机器上的字宽(intlong在32位和64位机器上的大小可能不同),并且您遇到所有指针故障。< / p>

您应该将BookStoreBook的每个字段按照

的顺序推送到输出流
file << book.isbn << ' ';
file << book.title << ' ';
...

请注意,上面的练习非常糟糕,因为解码变得非常困难。我建议您使用Boost.Serialization,或编写自己的方法来读取/写入文件中的键值对,或者您可能希望查看jsoncpptinyxml2。整个主题可能会变得非常复杂,所以坚持使用Boost是一个好主意,即使只想弄清楚如何自己解决问题(假设这是一个家庭作业)。