【发布时间】:2017-06-09 21:09:22
【问题描述】:
我有一段代码将一些浮点数写入二进制文件,然后将它们读回。读取的数据与写入的数据不同。
为什么会这样?可以修复吗?这是我的代码:
#include <fstream>
using namespace std;
int main ( int argc, char *argv[] )
{
float a[3];
float b[3];
a[0] = 0.3721548;
a[1] = 0.3721548;
a[2] = 0.3475495;
ofstream file("mlt_data", std::ios::binary);
file << a[0];
file << a[1];
file << a[2];
printf("write: \t%.7f %.7f %.7f\n", a[0], a[1], a[2]);
file.close();
ifstream file2("mlt_data", std::ios::binary);
file2 >> b[0];
file2 >> b[1];
file2 >> b[2];
printf("read: \t%.7f %.7f %.7f\n", b[0], b[1], b[2]);
file2.close();
return 0;
}
这是输出:
write: 0.3721548 0.3721548 0.3475495
read: 0.3721550 0.3721550 0.3475490
【问题讨论】:
-
在您喜欢的文本编辑器中检查文件的内容。您正在编写数字的十进制表示,精度为 6 位。
-
你的“二进制”在这里没有任何区别。您正在使用格式化的输出函数(运算符
<<)编写数据,这意味着您正在将其编写为文本。稍后您将其阅读为 text。如果您想将数据写入/读取为二进制数据,请使用二进制输入/输出函数。 -
当您写出数据时,您可能希望在数字之间添加空格以将它们分开。
-
@IgorTandetnik 是的,我知道,如果我只打印 6 位数字,它们看起来是一样的。但不同之处不仅在于打印。如果我尝试平等检查,我仍然会得到
false。 -
您正在以 6 位精度将数字写入文件。你在那个时候四舍五入,失去了额外的精度。当然,当您从文件中读取这些四舍五入的数字时,它们与原始数字不匹配。