【发布时间】: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。虽然,我认为这不是问题。