c++ - 将 float 写入和读取二进制文件时的不同值

标签 c++ io

我有一段代码将一些 float 写入二进制文件,然后再读回它们。读取的数据与写入的数据不同。

为什么会这样?可以修复吗?这是我的代码:

#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

最佳答案

尽管以二进制模式打开文件,但在使用 >> 时- 和 << -运算符(operator),您实际上将数据“序列化”为文本表示。使用 << 时关于数据类型 float ,该值默认四舍五入为 6 的精度。因此您在写入时“丢失”精度/信息,稍后在文本浮点表示中读取时无法重现。因此,输出的差异是由于您写入文件的值四舍五入为 6 位,而您 printf精度为 7 的值。

为了证明情况确实如此,请测试设置 << -精度为 7(就在实际写入值之前):

file << std::setprecision(7);

但实际上你应该以二进制格式写入你的数据:

file.write((const char*)a, sizeof(a));
...
file2.read((char*)b,sizeof(b));

关于c++ - 将 float 写入和读取二进制文件时的不同值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44466731/

相关文章:

c++ - 如何从内存中删除动态添加的节点?

C++ Overload Operator = for Pointers 不能正常工作/编译

c++ - 这个可变参数模板是如何工作的?

c - (高效)在 C 中将相同的数据写入多个文件

java - 如果我们在指定时间内没有收到响应,如何关闭 API 连接

c++ - Cython VS C++ 性能比较?

c++ - std::forward 不传递左值引用

java - 多线程环境中的 BufferedReader

c - Sscanf 读取一行两次?

linux - 删除正在进行 I/O 的文件 : Is it a filesystem and/or an OS feature?