天天看點

C++讀寫檔案時,0A轉化為0D 0A

用C++寫東西,需要往檔案裡寫資料,很簡單的代碼,大概是這個樣子:

#include <fstream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

 ofstream fout;

 fout.open("d:\\test.dat");

 int a = 0x7788;

 fout.write((char*) &a, sizeof(int));

}

打開test.dat,内容是77 88 00 00,很正常。

打開test.dat,内容是77 88 00 00,很正常。

但我要是把a的值改成0x0a,毛病就出來了,寫出來的東西是:0D 0A 00 00 00!

要是把a改成0x770a或者是别的什麼0a,隻要是數字中某一個位元組是0a,寫出來以後肯定變成0D 0A!比如0x770a就變成0D 0A 77!

更讓人寒的是,即使規定寫出的隻能是一個位元組,即寫:

 fout.write((char*) &a, sizeof(char));

隻要a的值的高位元組是0A,寫出來一樣變成0D 0A!也就是指定輸出1個位元組,實際卻輸出了2個位元組!

真是讓人費解啊。我一度認為C++出現了有史以來最莫名其妙的BUG,不過,且慢……

0A是什麼?0D 0A又是什麼?這個問題的解原來在這裡。先查查C++的文檔,裡面說明,ofstream的open函數,第二個參數指明打開方式,預設為ios_base::out,即按照位元組流的方式輸出文本。再看看0A到底是什麼,原來ASCII的0A是換行,也就是\n,再想想,Windows系統下的換行是如何處理的?\r\n啊。原來……

原來按照位元組流的形式輸出文本時,ofstream會自動将輸出的\n變成\r\n,以适應WIndows系統,結果以輸出資料的角度看來,這個正常的舉動就變成了不可解的“0A變成0D 0A”。

既然如此,答案也出來了,查查文檔,将打開檔案的一句改成:

fout.open("d:\\test.dat", ios_base::out | ios_base::binary);

搗亂的0A終于歸位了。

對于用fwrite寫檔案則要把參數設為wb才行~