2014-06-30 11 views
2

所以我開始用ANSI C書學習C語言。本書的早期練習之一就是編寫一個程序,該程序能夠接受文本輸入並將每一個單詞打印在一個新的行中,很簡單。所以我做:爲什麼EOF(文件結束)不在沒有' n'之前的行末尾工作?

#include <stdio.h> 

#define IN 1 
#define OUT 0 

main() { 

    int c; 
    int state; 

    state = OUT; 

    while((c = getchar()) != EOF){ 
     if(c != ' ' && c != '\n' && c != '\t'){ 
      state = IN; 
     }else if(state == IN){ 
      state = OUT; 
      putchar('\n'); 
     } 
     if(state == IN) 
      putchar(c); 
    } 

    getchar(); 
} 

的事情是,當程序正常工作就不會從while循環,如果我(在Windows上按Ctrl + Z)輸入EOF突破的線路,或在最後一個字符它的中間。

所以我找到了答案here

我學到的是(Ctrl + Z)char是某種信號來結束流,它必須在getchar()的新行上返回EOF。雖然這一切都很好,它有點幫助,我真的很想知道爲什麼EOF必須在自己的路線?

+0

看到這個答案http://stackoverflow.com/questions/4358728/end-of-file-eof-in-c?rq=1 –

+0

幾周前我們有一個類似的問題,我找不到對此的任何參考。但據我記得,對於大多數UNIX類終端,'^ D'刷新輸入緩衝區,如果刷新了EOF,EOF將被髮送;換行符也會刷新緩衝區。也許這對Windows來說是一樣的(用'^ Z'代替'^ D')? – mafso

+0

另請注意,最後一個'getchar();'永遠不會讀取任何東西(最後一個'getchar'調用在退出循環時返回'EOF')。 – mafso

回答

4

您遇到的問題與您的命令行終端有關,與文件標記本身的結尾無關。鍵入時不要將字符發送到程序,大多數終端都會等到您完成整行後才能將您鍵入的內容發送到程序。

您可以通過讓輸入來自文本文件而不是手動輸入來測試。您應該可以在沒有任何問題的情況下結束輸入文件而不換行。

./myprogram.exe < input.txt 

順便說一句,你鏈接的答案還指出,EOF不是人物,實際上是在你的輸入流,所以沒有辦法爲它來一個「前」「 \ N」。 EOF是getchar在沒有剩餘字符需要讀取時返回的值。

+0

是的,我明白'EOF'不是一個字符我沒有得到是爲什麼我不能使用(Ctrl + Z)在一行ti信號'getchar()'結束返回'EOF',你的答案使因爲現在我可以在這本書中放鬆和前進,而不會在這個問題上打破我的頭腦!謝謝。 –

3

從tty設備讀取數據(例如在控制檯或終端窗口中運行的程序的標準輸入)時,終端位於所謂的cooked mode中。在這種模式下,提供了一定程度的線條編輯功能,允許用戶退格並更改輸入的內容。

鍵入的字符只有在按下回車鍵之後纔會返回到程序。

通過將終端置於'原始'模式可以做到這一點。不幸的是,它似乎沒有很好的標準化,所以它有點系統特定。 this question的答案對於各種平臺都有一些例子。

相關問題