我想出了以下代码:
#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.。
我做错了什么?
答案 0 :(得分:3)
如果文件是二进制文件,则必须使用未格式化的输入函数:
double d;
if (!a0.read(reinterpret_cast<char*>(&d), sizeof(d))) {
// error occurred
}
std::cout << d << '\n';
运营商>>
执行格式化输入,这意味着它需要文件中的 text 。
修改强>
抱歉,最初使用的是get()
而不是read()
,这对于阅读二进制格式的文本文件更有用。
答案 1 :(得分:0)
您确定文件格式实际上是二进制文件吗?
如果您可以在文本编辑器中查看该文件,请删除ios :: binary标志。
也可以尝试使用%g作为printf格式;这是显示双倍的正常选择。