2

我想出了以下代码:

#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。

我究竟做错了什么?

4

2 回答 2

3

如果文件是二进制文件,则必须使用未格式化的输入函数:

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

运算符进行格式化输入,这意味着它需要>>文件的文本。

编辑

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

于 2013-05-18T16:22:13.387 回答
0

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

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

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

于 2013-05-18T16:19:36.800 回答