【问题标题】:Reading objects from a binary file从二进制文件中读取对象
【发布时间】:2015-06-14 11:50:27
【问题描述】:

我写了一个程序,让你输入关于汽车的信息,然后将对象写入二进制文件。

Car car_obj; std::ofstream entr; std::ifstream ex; 
void save_data() {

entr.open("main.bin", std::ios::app | std::ios::binary);

    car_obj.setInfo(); entr.write((char*)&car_obj, sizeof (car_obj));

entr.close();

}

在此之后,我有一个函数正在读取这个二进制文件,以显示所有油耗低于用户输入的汽车(数字是函数参数中的因子)。

void vehicles_under_factr(float factr) {

ex.open("main.bin", std::ios::app | std::ios::binary);


while (ex.read((char*)&car_obj, sizeof (car_obj)) && !ex.eof()) {

    if (car_obj.fuel_cons < factr) {

        car_obj.displayInfo();

    }
} 

ex.close();

}

它工作正常,但前提是我的二进制文件中有三个或更少的对象。当超过三个时,它将其余部分显示为空字段。好像第三辆车之后就没有通道了。为什么会这样,我该怎么办?

我感觉接近解决方案,但我的知识有限。提前谢谢!

【问题讨论】:

  • 您将不得不提供一个小而完整的代码示例来展示您的问题。由于您使用的是二进制文件,因此如果该代码写出一组对象然后尝试读入它们可能会有所帮助。否则,人们只会猜测是什么导致了您的问题。
  • Car 类的内存布局实际上看起来如何?由于序列化指针,您可能无法做您想做的事情。
  • 您的阅读代码以附加模式打开文件(这意味着它在末尾而不是开头打开)并且您正在循环 ex.eof() [所以代码将尝试从末尾开始读取,然后测试 EOF]。
  • 天哪,彼得是对的,谢谢!这是一个我没有看到的愚蠢错误......
  • 如果您尝试在另一台计算机上打开文件,请阅读Endianness。虽然,我认为这不是问题。

标签: c++ file binary


【解决方案1】:

不,你不能这样做,读取((char *)obj, sizeof(obj)),因为程序中的每个对象都有自己的内存地址,由系统分配。你看不懂地址 从文件中。如果你的对象只包含数据,它工作正常,但如果它的元素是一个对象,并且它本身属性相关的内存地址或迭代器(相关的内存地址)。它工作失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 2015-07-27
    • 1970-01-01
    相关资源
    最近更新 更多