2015-08-21 29 views
1
if (fgets(string, 35, stdin)==NULL) 

它只適用於我只使用ctrl + D如何在使用fgets作爲輸入函數時檢測文件的結尾?

它將打印

「我想要什麼」

並退出。

但是,如果我鍵入

'ABC'

和不按輸入,然後按ctrl + d

它不起作用,並繼續運行,直到我第二次使用ctrl + D

你能告訴我一些想法嗎?

+0

不同的操作系統和鍵盤接口有不同的方式來生成'EOF'。發佈你的操作系統細節 – chux

+0

這是大多數Unix操作系統的正常行爲 - 我要在這個假設上發佈一個答案(因爲非Unix用戶期望ctrl-D工作並不典型) – Random832

+3

可能的[ctrl- D沒有停止while(getchar()!= EOF)循環](http://stackoverflow.com/questions/11944314/ctrl-d-didnt-stop-the-whilegetchar-eof-loop) – ace

回答

2

這是正常的行爲 - 當你在輸入一些字符後輸入它時,它允許進程讀取你輸入的字符(你會注意到你不能退格到這一點,並且如果您在如cat做到這一點,你鍵入的字符可立即附和)

The relevant Unix standard can be found here

EOF

輸入特殊字符,如果ICANON標誌設置這是公認的。收到時,等待讀取的所有字節會立即傳遞給進程而不等待<換行符>,並且EOF被丟棄。因此,如果沒有等待的字節(即EOF發生在一行的開始處),則應從read()返回0的字節計數,表示文件結束指示。如果ICANON被設置,EOF字符在處理時應該被丟棄。

基本上,ctrl-D在行的中間並不是「真正」的文件結尾,也沒有理由期望檢測到它。如果你想結束沒有最終換行符的標準輸入,只需按兩次ctrl-D。

+0

我的老師需要我們結束程序,當第一個CTRL + D –

+1

@鄭路這是根本不可能的,除非你的程序直接捕獲鍵盤事件。 – ace

+0

嘗試向你的老師展示這個標準,並詢問這是否包括如果他們在一行中間按ctrl-D。他們可能甚至沒有想到它。 – Random832

相關問題