當我寫一個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