2013-03-14 7 views
1

我正在讀取由chars組成的TXT文件並將其寫入包含char的ASCII值的output.txt文件。 任何時候我讀了ASCII表(換行)字符數10,在我的輸出文件,我得到的 13則改爲10 10 (13平均回車ASCII格式)爲什麼fgetc函數會添加回車

我該怎麼解決呢? 我的代碼:

in_file = fopen(FILE_NAME, "rb"); 
... 
    while((ch = fgetc(in_file)) != EOF){ 
    count++; 
    fprintf(p, "%d\n", ch); 
    } 

感謝

回答

4

輸入文件已被格式化與Windows換行符,這是一對\r\n字符。 UNIX文本文件只有\n。因此你的輸出是正確的。

+0

好的,我怎樣才能改變我的input.txt文件的格式 – user2080006 2013-03-14 15:34:32

+1

@ user2080006:你可以自己過濾\ r。或者你使用一個外部工具,比如'dos2unix'。或者以二進制模式打開輸出文件,而不是文本模式... – DevSolar 2013-03-14 15:35:23

+0

謝謝,但我在自動測試中使用此值。 有辦法解決它到我的.c代碼? – user2080006 2013-03-14 16:30:11

1

字符10是一個換行符(\n);字符13是回車符(\r)。 Windows行結束符通常是一個回車符,後跟一個換行符。在UNIX/Linux上,行結束符通常只是一個換行符。在Mac OS上,它曾經只是一個回車IIRC,但OS X可能不再是這種情況(因爲它是UN * X下的)。

該文件可能已在Windows系統上創建,如@jazzbassrob所述。
或者,如果您在Windows系統上運行,我相信I/O庫函數的一些實現會將UNIX風格的行終止符轉換爲Windows風格。

因此,正如其他海報所指出的,輸出可能是正確的。

編輯:
嘗試從呼叫的bfopen();以二進制模式打開文件。在「文本」模式下 - 即fopen(FILE_NAME, "r") - fgetc()可能會丟棄回車。

編輯2: 在文本模式下,行結束符應該被標準化爲一個換行符(正如@DevSolar指出的那樣)。另一方面,如果以二進制模式打開文件,則不應假定或依賴作爲行終止符的特定字符。 (除非您控制輸入文件的創建,您特別關心從一種格式轉換爲另一種格式等)

+1

C標準將\ n指定爲行終止符。在文本模式下打開文件應該使任何平臺特定的行終止符對應用程序透明。再一次,這就是理論。 OP不*以文本模式打開輸入文件(並且他也沒有告訴我們在哪個操作系統上運行)。 – DevSolar 2013-03-14 15:47:05

+0

最初我認爲二進制標誌是故意的。我意識到假設可能是錯誤的,並且在您評論時正在編輯我的回覆;) – David 2013-03-14 15:54:20

+0

如果將模式從「rb」更改爲「r」,當我收到EOF時,循環中斷 – user2080006 2013-03-14 16:22:56

0

您讀取回車符(0x0d),因爲您以二進制模式讀取文件"rb",這樣fgetc()會讀取每個字符,包括0x0d,然後是0x0a(回車)。

如果您打開該文件作爲文本"r",龜etc()如果隨後0x0a和只顯示0x0a將跳過0x0d

+0

以文本方式打開輸入文件只會對Windows/DOS系統產生影響。 UNIX系統對待兩種模式都是一樣的...... – thkala 2013-03-14 15:52:24

+0

有一種方法可以在不使用二進制模式的情況下讀取由字符組成的txt文件? 我試過這第一次,但任何時候,fgetc接收EOF我的while循環破壞 – user2080006 2013-03-14 16:45:58

+0

@ user2080006:「任何時間」? fgetc()在到達文件結尾時應該接收EOF(文件結束,-1),一次*,在這種情況下,你的循環*應該*結束。在這種情況下,二進制文本模式與文本模式不應改變任何內容 – DevSolar 2013-03-19 08:42:59

相關問題