簡體   English   中英

如果不檢查 C 中的 feof 會發生什么?

[英]What happens if you don't check feof in C?

在讀/寫操作期間是否絕對有必要檢查feof()

我問的原因是因為我有一個執行讀/寫ONCE的程序,這里是下面的代碼:

while (1) {

      data = read_file_data(file);
      write_file_data(data, filename);

      if (feof(file)) 
          print(read error)
}

這只是偽代碼,但在這樣的情況下是否有必要檢查feof()會發生一次讀取? 目前,我認為只有在您像這樣在上面的閱讀之后再閱讀一次時才有必要:

while (1) {

      data = read_file_data(file);
      write_file_data(data, filename);

      if (feof(file))       // feof error occurred oops
          print(read error)

      data = read_file_data(file); // reading after error    
}

最后,即使在EOF reached錯誤(閱讀過去EOF )發生后,閱讀的后果是什么?

在讀/寫操作期間是否絕對有必要檢查 feof()?

否。在正常操作期間,檢測 EOF 的最佳方法是檢查您正在使用的特定輸入調用的返回值。 輸入調用總是會失敗,因此應始終檢查它們的返回值。 對於scanffgets尤其如此,許多初學者(不幸的是許多初學者編程教程)明顯忽略了檢查。

很少需要顯式調用feof 如果出現以下情況,您可能需要調用feof

  • 輸入調用剛剛返回 0 或EOF ,但您想知道這是由於實際的文件結尾還是更嚴重的錯誤。
  • 您使用了諸如getw()之類的輸入調用,它無法指示 EOF 或錯誤。
  • (罕見,並且可以說是糟糕的形式)您已經連續進行了一系列輸入調用,並且您沒想到它們中的任何一個都會出現 EOF,因此您不想明確檢查所有這些,但決定最后檢查一個對feof()的全面調用。

要知道的另一件事是feof()只告訴您您確實遇到了文件結尾 - 即過去時。 它不預測未來; 它不會告訴您您嘗試進行的下一個輸入調用將命中 EOF。 它告訴你,你之前的調用確實命中了 EOF。 另請參閱為什么“while(?feof(file))”總是錯誤的?

另請參閱使用 fread() 和 fwrite 時如何檢測讀/寫錯誤?


即使在 EOF 到達錯誤(讀取過去 EOF)發生后,讀取的后果是什么?

這是個好問題。 答案是“視情況而定”,而且由於不可預測性可能是一個真正的問題,因此最好的選擇通常是不要嘗試閱讀過去的 EOF。

當我第一次學習 C 時,如果您獲得了 EOF,但嘗試閱讀更多內容,並且如果 EOF 以某種方式“消失”了,那么您的下一次閱讀可能會成功。 如果您正在從鍵盤閱讀,並且用戶通過鍵入 control-D 來指示 EOF,那么 EOF 像這樣“消失”可能是很常見的。 但如果他們在輸入 control-D 后輸入更多輸入,您可以提前 go 閱讀它。

但那是在過去。 這些天EOF是“粘性的”,一旦為stream設置了文件結束標志,我認為任何未來的讀取嘗試都應該立即返回EOF。 如今,如果用戶點擊 control-D 並且您想繼續閱讀,則必須調用clearerr()

我很確定我剛才所說的關於feof()和 per-stream EOF 標志的所有內容對於ferror()和 per-stream 錯誤標志也是如此。

在評論中,@0___________ 說“如果您忽略 I/O 錯誤並繼續調用未定義的行為”。 我不認為這是真的,但我沒有手邊的標准副本可供檢查。

調用feof的原因是要確定從輸入 function 返回的EOF是否由於某種實際的 I/O 錯誤(然后ferror()將返回非零值但feof()不會),或者由於輸入已用盡(這不是錯誤,而是條件; feof()將返回非零值)。

例如,如果您的程序要消耗所有輸入並對其進行處理,那么能夠區分您實際上確實讀取了所有輸入與有人在您讀取一半時從驅動器中移除了 USB 記憶棒可能是至關重要的。輸入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM