ifstream 流 判斷文件是否結尾的函數eof(.xml


   fstream流的eof()  判斷有點不合常理
 
 
   按正常邏輯來說,如果到了文件末尾的話 ,那eof()應返回真
 
   但是,c++輸入輸出流如何知道是否到末尾呢?
 
   原來是根據的是: 如果fin>>不能再讀入數據了,才發現到了文件結尾,這時才給流設定文件結尾的標志,此后調用eof()時,才返回真。
 
 
   假設
 
   fin>>x; //此時文件剛好讀完最后一個數據(將其保存在x中)
 
   但是, 這時 fin.eof()仍未假 因為,fin流的標志eofbit是FALSE, fin流此時認為文件還沒有到末尾
 
   只有當流再次讀寫時
 
   fin>>x; 發現已無可讀寫數據,此時流才知道到達了結尾,這時才將標志eofbit修改為TRUE
 
   此時流才知道了文件到底了末尾
 
 
 
   也就是說,eof在讀取完最后一個數據后,仍是False,
 
                  當再次試圖讀一個數據時,由於發現沒數據可讀了 才知道到末尾了,此時才修改標志,eof變為TRUE
 
 
 
 
 
  以下例子:
 

 

    ifstream fin("D://line.txt");  
      
    ofstream fout("D://T_line.txt",ios::trunc);  
      
      
    list<tag_Point> test_list;  
      
    tag_Point test;   
      
      
      
    while (!fin.eof())  
    {  
       
      
      
     fin>>test.x;  
     fin>>test.y;  
     fin>>test.z;  
      
      
      
      
     test_list.push_back(test);  
       
      
    }  
      
      fin.close();  
      
        
 
 在運行時 發現  test_list中的數據比文本中的數據多一行,也就是 文本中最后一行的數據寫了兩遍
 
 始終無法理解
 
  現在明白了:》
 
  再讀完最后一行后,
 
  因為fin.eof()仍為假, 所以會繼續while循環
 
  當執行到while的第一個語句   fin>>test.x時,發現無可讀數據了,此時修改流屬性,fin.eof ()變為TRUE
 
  再執行   fin>>test.y; fin>>test.z;時,因為已經到文件末尾了 ,所以 test保留了上次的值,也即test中的值為變,還是文本最后一行
 

的數據

 
  此時再push_back(test),壓入列表的仍是最后一行數據
 
  由此導致了,列表中的數據比文本中的數據多一行
 
 
 
---------------------
 
 

知道了原因 ,便很好作出修改了

 
 
  修改為:
 

 

    while (  fin>>test.x&&fin>>test.y&& fin>>test.z)  
    {  
       
      
     test_list.push_back(test);  
       
      
    }  
      
      fin.close();  
 
 
 這樣便沒問題了 ,當讀取完最后一行數據后,將其放入列表中,此時判斷while條件,也就是再次讀取數據,發現無數據可讀,讀取不成功 fin>>test.x返回False 由此結束循環。
 
 

本文使用 書畫小說軟件 發布,內容與軟件無關,書畫小說軟件 更愜意的讀、更舒心的寫、更輕松的發布。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM