[C|C++]feof使用注意

有時候在使用檔案讀寫時,會遇到要判斷檔案結尾的需求,而C/C++語言在中有提供一個feof()的函式幫助我們判斷,但是在使用時,請先了解它的使用時機。

前言

 


 

有時候在使用檔案讀寫時,會遇到要判斷檔案結尾的需求,而C/C++語言在<stdio.h>中有提供一個feof()的函式幫助我們判斷,但是在使用時,請先了解它的使用時機。

 

發生狀況->多讀一次?

 


 

下面的寫法模式會發生多讀取的case,而這個原因在於使用feof的時機不對。


FILE* pf;
 while(!feof(pf)){
   //fread 讀取
   //資料處理
 }

 

feof的解讀

 


 

feof是發生在fread使用"讀取過檔案"後,已讀到End-of-file位置時,回傳的指標才會是true(檔案結尾),所以上面的寫法在讀完最後一筆後,指標會停留在End-of-file位置前,需要再讀一次到在End-of-file位置後(判斷讀取資料失敗,因為已讀到eof),才會為true,而因為fread讀取失敗,buffer的資料不會改變,所以才會多讀一筆,如下圖:

 

解決方式

 


 

 改善的方式,如先使用fread讀取,再來判斷feof,當feof判斷為true時就跳離loop


while(1){
  //fread讀取
  if(feof(pf)) break;
}

 

參考資料

〔教學〕C 及 C++ 常犯錯誤 - EOF 測試的錯誤用法

 


 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝 =)

另外要轉載請附上出處 感謝