if (fgets(string, 35, stdin)==NULL)
它只適用於我只使用ctrl + D。如何在使用fgets作爲輸入函數時檢測文件的結尾?
它將打印
「我想要什麼」
並退出。
但是,如果我鍵入
'ABC'
和不按輸入,然後按ctrl + d。
它不起作用,並繼續運行,直到我第二次使用ctrl + D。
你能告訴我一些想法嗎?
if (fgets(string, 35, stdin)==NULL)
它只適用於我只使用ctrl + D。如何在使用fgets作爲輸入函數時檢測文件的結尾?
它將打印
「我想要什麼」
並退出。
但是,如果我鍵入
'ABC'
和不按輸入,然後按ctrl + d。
它不起作用,並繼續運行,直到我第二次使用ctrl + D。
你能告訴我一些想法嗎?
這是正常的行爲 - 當你在輸入一些字符後輸入它時,它允許進程讀取你輸入的字符(你會注意到你不能退格到這一點,並且如果您在如cat
做到這一點,你鍵入的字符可立即附和)
The relevant Unix standard can be found here:
EOF
輸入特殊字符,如果ICANON標誌設置這是公認的。收到時,等待讀取的所有字節會立即傳遞給進程而不等待<換行符>,並且EOF被丟棄。因此,如果沒有等待的字節(即EOF發生在一行的開始處),則應從read()返回0的字節計數,表示文件結束指示。如果ICANON被設置,EOF字符在處理時應該被丟棄。
基本上,ctrl-D在行的中間並不是「真正」的文件結尾,也沒有理由期望檢測到它。如果你想結束沒有最終換行符的標準輸入,只需按兩次ctrl-D。
不同的操作系統和鍵盤接口有不同的方式來生成'EOF'。發佈你的操作系統細節 – chux
這是大多數Unix操作系統的正常行爲 - 我要在這個假設上發佈一個答案(因爲非Unix用戶期望ctrl-D工作並不典型) – Random832
可能的[ctrl- D沒有停止while(getchar()!= EOF)循環](http://stackoverflow.com/questions/11944314/ctrl-d-didnt-stop-the-whilegetchar-eof-loop) – ace