2013-05-15 31 views
1

運行下面的代碼:寫號文件 - 奇怪的結果

ofstream newfile(path + "file" + ".hash", fstream::out); 
filefl.open(path + "file" + ".hash", fstream::out); 
char a = 10; 
filefl<<a; 
filefl.close(); 

結果與它0D 0A(十六進制編輯器中查看)的文件。
a=9包含09文件時。
sizeof(char)爲1
我的操作系統是Win7的X64和代碼通過VS2010親運行。
有人可以解釋這一點嗎?

+0

什麼樣的結果你真的指望什麼? '0D''0A'是回車,換行。您的操作系統可能會將10(即0A)擴展爲CRLF組合。您應該以任何二進制模式打開您的文件。 –

+0

值'10'由流轉換爲卡拉格返回/換行組合。這是Windows特定順便說一句。 –

回答

2

看起來像目標流被自動擴展所述換行(是0xA,或10)到Windows友好回車符換行對(爲0xD是0xA)。

+0

如果您不想要這種行爲,請打開文件以二進制模式進行讀取和寫入。 – Patashu

1

這是設計。您正在以文本模式打開文件。 Windows在文本模式下將'\n'(0x0A)轉換爲0D 0A。還要注意不要將0x1A寫入此文件(它是文本文件的EOF)。

我不知道該文件的目的,但如果要存儲二進制數據,那麼就應該以二進制模式打開。

0

我懷疑你是希望它打印出「10」,換句話說字符串「1」,「0」到文件中。

但是char通常是用C解釋爲字符串的一個字符,而不是一個號碼。數字的常用數據類型是int

因此,發生的情況是,iostreams函數默認將您的char解釋爲ASCII碼字符「newline」,值爲10。如果你想實際打印10然後換charint或重寫輸出線路使用靜態投,像這樣:

filefl << static_cast<int>(a); 
+0

我不是。我試圖寫'0x0A' – elyashiv

+0

@elyashiv:然後提示:C程序員不會養成將字符寫成數字的習慣。你應該使用''\ n''或''\ x0a''來表明你打算將它作爲文本字符。 –