2013-09-28 18 views
0
char ch; 
while((ch = getchar()) != EOF){ 
    putchar(ch); 
} 

上面的代碼顯然是應該複製我的輸入。它對基本的ASCII文本文件起作用。但是,如果我發送一個gif,尤其是這一個,但適用於大多數(http://www.cs.utexas.edu/~peterson/prog2/smile.gif),那麼當我重定向stdin爲gif,並且stdout爲任何文件類型,並且在原始文件上運行diff並且新的,錯誤嘉豪。在這種情況下,超過一半的文件甚至沒有處理,只是退出。 任何線索?我願意切換到另一個輸入/輸出功能,只要我可以一次輸入一個字節。getchar()意外的行爲

+1

'getchar'正在讀取標準輸入文本,而不是一般的二進制文件。 'gif'是一個二進制文件。 – lurker

+0

是的,打開二進制文件作爲二進制文件。 –

+3

getchar返回一個int,而不是char。 – rici

回答

3

getchar返回int,而不是char。區別很重要,因爲它可能會返回EOF,這是一個不能爲char的值。

你不能可靠地測試EOF如果你的getchar返回值轉換爲char。當您點擊值爲(char)EOF的字符時,循環將終止。

通過將ch聲明爲int來解決此問題。

+0

由getchar()返回的值,不包括EOF,仍然在正常字符的範圍內,所以沒有2^30 ...? – pbae

+0

你能詳細說明一下它是不可靠的嗎? – pbae

+1

其實我只是查了一下。該行爲由標準決定,所以getchar()將始終返回EOF或範圍內的整數,可表示爲* unsigned * char,無論char是有符號還是無符號。你不能指望EOF是-1;只是它不在無符號字符的範圍內。 – rici