2013-11-02 46 views
4

我正在使用下面的C代碼從終端讀取用戶輸入。如果用戶輸入EOF,例如通過按壓^ C,stdin被關閉,並隨後嘗試從它讀取,例如通過getchar()或scanf()會導致異常。從Eof中恢復stdin C

有什麼我可以做的C來「恢復」我的程序,從某種意義上說,如果一些用戶意外輸入EOF,這將被忽略,所以我可以再次從標準輸入讀取?

#include <stdio.h> 

int main(void) 
{ 
    int res_getchar=getchar(); 
    getchar(); 
    return 0; 
} 
+1

不清楚你在問什麼? – haccks

+1

死後有人能讓你恢復活力嗎? 'stdin'也是如此,如果你發送'eof',那麼你就殺了它。 –

+0

我在找transanimation :-) – lee77

回答

1

使用ungetc()推回字符可以清除流的EOF指示符。

C99§7.19.7.11的ungetc功能

int ungetc(int c, FILE *stream); 

成功調用的ungetc函數清除,數據流的結束的文件指示符。讀取或丟棄所有推回的字符後,流的文件位置指示符的值應與推送字符之前的值相同。

+0

有趣;但它並沒有改變EOF即將到來的事實。 –

+0

當我在上面的代碼中使用'ungetc(EOF,stdin);'在我的系統上時,它返回EOF,也就是失敗... – lee77

+0

@ ErnestFriedman-Hill這取決於OP所尋找的是什麼,從EOF恢復的方式。 –

0

總之,沒有。您在操作系統關閉stdin時閱讀EOF。

我確定有依賴於平臺的方式來保留一些信息,讓你重新構建標準輸入後關閉 - 即打開一個新的流連接到鍵盤,並將其分配給標準輸入 - 但肯定沒有便攜的方式。

+0

看着其他答案,「總而言之,不」似乎不正確。或者至少沒有用處。 – hyde

4

如果我理解正確的情況 - 你從終端經由stdin閱讀,用戶類型^d,你想要放棄並重新輸入問 - 你有兩個選擇,一個更便攜(而且非常簡單),但工作的可能性較小,便攜性較差(編程相當多),但肯定可以工作。

  • clearerr功能是標準的C,並且記錄以清除粘誤差和FILE物體上粘EOF標誌;如果你的問題是C庫一旦被指示EOF就不會再打電話read,這可能會有所幫助。

    如果這樣可解決立即解決問題,確保,如果你在一排的EOF的一些數字(四至十個,說)你放棄和退出,因爲如果stdin終端,或者如果終端真正被關閉,EOF條件永遠不會消失,並且當發生這種情況時,您不希望程序陷入無限循環。

  • 在僅POSIX兼容的系統(即,「不視窗」),則可以使用cfmakeraw禁用輸入預處理,輪流^d到EOF指示。

    這樣做意味着您也必須自己處理其他材料的整批;您可以改爲使用爲您處理它的第三方庫,例如readline(GPL)或editline(BSD)。如果你的程序是任何一種平凡的交互式命令解釋器,使用這些庫中的一個是強烈鼓勵,因爲它將提供更好的用戶體驗。

+0

是的,情況就是這樣,它是一個終端。感謝關於真正關閉的終端的提示。 – lee77

+0

我也想接受你的回答,但似乎不可能......我扔了一枚硬幣...... – lee77