c++用二进制文件读/写对象
C++ reading/writing objects with binary files
我花了几个小时的时间试图修复二进制文件操作的问题。
任务是读写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++中的数据结构出现在内存中时,将它们写入磁盘实际上总是被认为是一种不好的做法。这样做没有考虑不同机器的不同端序,不同机器上的字宽(int
或long
在32位和64位机器上的大小可能不同),并且您会遇到所有指针问题。
您应该将BookStoreBook
的每个字段沿
file << book.isbn << ' ';
file << book.title << ' ';
...
请注意,以上是非常糟糕的做法,因为解码变得非常困难。我建议你使用Boost。序列化,或者编写自己的方法,可以从文件中读取/写入键值对,或者您可能想要查看jsoncpp或tinyxml2。整个主题可能会变得相当复杂,所以坚持使用Boost是个好主意,即使只是为了弄清楚如何自己解决这个问题(假设这是一个家庭作业)。
- 对在不同二进制文件中创建的对象文件的依赖关系
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 使用此指针在 c++ 中将对象写入二进制文件
- 将对象信息保存到二进制文件中
- 如何使用自定义对象的序列化在 c++ 中编写自定义二进制文件处理程序
- C#将类对象写入二进制文件
- C++/Python 中对象和结构的二进制文件结构
- 将对象(指针)在地图中输出到二进制文件
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 使用 C++ 将对象读取和写入二进制文件
- 正在从二进制文件中读取对象列表
- C++ - 如何编写和读取包含对象的结构?(写入和读取二进制文件)
- C++ 将对象写入二进制文件
- 将二进制文件的一部分读入预先存在的basic_string对象
- 如何像二进制文件一样读取提升mapped_region对象
- CMake:从外部项目链接共享C++对象会生成具有相对路径的二进制文件,而不是绝对路径
- 对于二进制数据,哪个性能更高:将整个对象写入文件或分隔变量(无对象)
- c++这个将对象写入二进制文件
- c++将对象写入和读取到二进制文件中
- 将二进制文件用于复杂对象C++