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 由此结束循环。
 
 

本文使用 书画小说软件 发布,内容与软件无关,书画小说软件 更惬意的读、更舒心的写、更轻松的发布。

 

你可能感兴趣的:(Stream)