当我写一个double到一个文件流,然后写一个整数,整数作为额外数字附加到双精度,我不知道为什么会发生。有人可以为我解释这个吗?小例子:fstream产生真正奇怪的行为
#include <iostream>
#include <fstream>
int main()
{
std::fstream s("test.bin", std::fstream::binary | std::fstream::trunc | std::fstream::in | std::fstream::out);
s << 3.14;
int n = 36;
s << n;
s.seekp(0);
double d;
s >> d;
printf("%f\n", d);
}
我期待发生的事情:
- 程序会打开一个名为TEST.bin,烧写
- 它的价值
3.14
写入文件(8个字节) - 它将值
36
写入文件(4字节) - 它跳回到缓冲区的开头
- 它读取双型值(8个字节)
- 它打印(显示
3.140000
)
值实际发生的: 方案产出3.143600
- 我完全不知道为什么发生。它毫无意义。如果我改变初始值,比如从3.14
到18.3204
,那么它输出18.320436
。发生了什么?
使用'std :: cout'而不是一些输出文件流。然后问自己,你会怎么决定,你是一个简单的'双提取算法,在哪里*停止*阅读数字。你的输出'double'和输出'int'之间没有空格。你意识到这是*格式*输出,*正确*? – WhozCraig
它是不是把double值写成8个纯字节? –
不,'<<'执行格式化输出,而不是二进制输出,即使使用'std :: fstream :: binary'。 – Barmar