【问题标题】:How do I read a double from file?如何从文件中读取双精度?
【发布时间】:2013-05-18 16:15:40
【问题描述】:

我想出了以下代码:

#include <stdio.h>
#include <iostream>
#include <fstream>

int main() {
  std::ifstream a0;
  a0.open("data/a0", std::ios::in | std::ios::binary);
  double d;
  a0 >> d;
  printf("%e\n", d);
}

我用编译

g++ -s -Wall -Wextra -pedantic -std=c++0x -o program program.cpp

但它不起作用 - 它打印 0(文件的实际前 8 个字节是 3D 8F A0 BB E0 00 00 00)。 更有趣的是,当data/a0文件不存在时,会输出垃圾,但如果文件存在,则输出总是严格为0。

我做错了什么?

【问题讨论】:

    标签: c++ file c++11


    【解决方案1】:

    如果文件是二进制文件,你必须使用 unformatted 输入函数:

    double d;
    if (!a0.read(reinterpret_cast<char*>(&d), sizeof(d))) {
      // error occurred
    }
    std::cout << d << '\n';
    

    操作员&gt;&gt; 进行格式化 输入,这意味着它需要文件中的文本

    编辑

    对不起,原来用get()代替read(),这对于读取二进制格式的文本文件更有用。

    【讨论】:

    • 我一定是瞎了:(谢谢!有没有简单的方法可以让这个以大端顺序读取双精度?
    • @Rogach 恐怕没有。您必须将其读入内存(可能读入unsigned char[sizeof(double)]std::arrray&lt;unsigned char, sizeof(double)&gt;)并自行转换。
    • 嗯。我也可以更轻松地以 little-endian 编写该文件,因此我不需要转换。非常感谢!
    【解决方案2】:

    您确定文件格式实际上是二进制文件吗?

    如果您可以在文本编辑器中查看文件,则删除 ios::binary 标志。

    也可以尝试使用 %g 作为 printf 格式;这是显示双精度的正常显示。

    【讨论】:

    • %e 非常适合 double,它表示指数符号。 %f 表示固定符号,%g 表示“使用更适合双精度特定值的符号。”
    猜你喜欢
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2011-05-09
    • 1970-01-01
    相关资源
    最近更新 更多