
古代的劍客們與
對手相逢時,無
論對手多麼強大,
明知不敵,也要亮出自己的劍!
讀者:這樣的代碼有什麼問題?char c; while((c = getchar()) != EOF)
小林:第一, 儲存 getchar 的傳回值的變量必須是 int 型。getchar() 可能傳回任何字元值, 包括 EOF。如果把 getchar 的傳回值截為 char 型, 則正常的字元可能會被錯誤的解釋為 EOF, 或者 EOF 可能會被修改 (尤其是 char 型為無符号的時候), 進而永不出現。
讀者:我有個讀取直到 EOF 的簡單程式, 但是我如何才能在鍵盤上輸入
那個 “EOF” 呢?
小林:其實, 你的C程式看到的 EOF 的值和你用鍵盤發出的檔案結束按鍵組合之間沒有任何直接聯系。根據你的作業系統, 你可能使用不同的按鍵組合來表示檔案結束, 通常是 Control-D 或 Control-Z。
讀者:為什麼這些代碼 while(!feof(infp)) { fgets(buf, MAXLINE,
infp); fputs(buf, outfp); } 把最後一行複制了兩遍?
小林:在 C 語言中, 隻有輸入例程試圖讀并失敗以後才能得到檔案結束符。換言之,C 的 I/O 和 Pascal 的不一樣。通常你隻需要檢查輸入例程的傳回值, 例如, fgets()在遇到檔案結束符的時候傳回 NULL。實際上, 在任何情況下, 都完全沒有必要使用 feof()
有時候,正是那些意想不到之人,成就了無人能成之事。