pre{
line-height:1;
color:#800080;
font-size:16px;}.sysFunc{color:#627cf6;font-style:italic;font-weight:bold;}
.selfFuc{color:#800080;}
.bool{color:#d2576f;}
.condition{color:#000080;font-weight:bold;}
.key{color:#000080;}
.var{color:#800000;font-style:italic;}
.Digit{color:#ff00ff;font-weight:bold;}
.includePre{color:#800080;}
.operator {color:#008000;font-weight:bold;}

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

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

 

ifstream 流 判断文件是否结尾的函数eof(.xml的更多相关文章

  1. 转载 - C++ - 关于ifstream/fstream流 判断文件是否结束eof()的问题

    出处:http://blog.csdn.net/shuilan0066/article/details/4669451 在做实验的时候遇到这个问题,找原因的时候发现出处除了讲明原因,还举了例子,所以记 ...

  2. C#根据文件流判断文件类型

    判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </su ...

  3. java根据文件流判断文件类型(后缀名)

    import java.io.FileInputStream; public class FileType{ public static String bytesToHexString(byte[] ...

  4. c#真正判断文件类型

    //真正判断文件类型的关键函数 public static bool IsAllowedExtension2(FileUpload hifile) { if (hifile != null) { Sy ...

  5. 读取文件时,使用file.eof()判断结尾注意事项

    今天写一个小功能需要读取文件,在判断文件结尾时使用了以下语句: while(infile.eof() && infile.good()) { infile.read((); encod ...

  6. 使用feof()函数判断文件是否结束

    课本上时这样写的:(用putchar(ch);代表对取出来的字符的处理.) while(!feof(fp)) { ch=fgetc(fp); putchar(ch); } 但是,这样写的话,fgetc ...

  7. ofstream的使用方法--超级精细。C++文件写入、读出函数(转)

    ofstream的使用方法ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间;  在C++中,有一个stream这个类,所有的I/O都以这个“流”类为基础的, ...

  8. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...

  9. I/O流+统计文件词频

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

随机推荐

  1. 常用WinPE

    微PE工具箱:http://www.wepe.com.cn/ 绝对PE工具箱:http://dl.pconline.com.cn/download/64736.html 通用PE工具箱:http:// ...

  2. Makefile 快速入门

    Makefile 速成 标签: Makefile编译器 2015-06-06 18:07 2396人阅读 评论(1) 收藏 举报  分类: C/C++(132)  Linux & MAC(19 ...

  3. 常用Linux命令小结

    常用Linux命令小结 Linux下有很多常用的很有用的命令,这种命令用的多了就熟了,对于我来说,如果长时间没有用的话,就容易忘记.当然,可以到时候用man命令查看帮助,但是,到时候查找的话未免有些临 ...

  4. jdbc框架 commons-dbutils的使用

    commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装,学习成本极低,并且使用dbutils能极大简化jdbc编码的工作量,同时也不会影响程序 ...

  5. linux系统的目录讲解

    还记得在前面介绍c h m o d命令时讲过,目录的权限位和文件有所不同.现在我们来看看其中的区别.目录的读权限位意味着可以列出其中的内容.写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你 ...

  6. leetcode:Contains Duplicate和Contains Duplicate II

    一.Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your fun ...

  7. poj3683 Priest John's Busiest Day

    2-SAT 输出可行解 找可行解的方案就是: 根据第一次建的图建一个反图..然后求逆拓扑排序,建反图的原因是保持冲突的两个事件肯定会被染成不同的颜色 求逆拓扑排序的原因也是为了对图染的色不会发生冲突, ...

  8. poj 2773(容斥原理)

    容斥原理入门题吧. Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9798   Accepted: 3 ...

  9. Spring MVC文件下载

    方案一: // 文件下载 @RequestMapping(value = "/downloadFile") public ResponseEntity<byte[]> ...

  10. C++获取进程号及窗口

    #include <TlHelp32.h> //根据进程名获取进程ID BOOL GetPidByProcessName(TCHAR *pProcess, DWORD*dwPid) { H ...