心血来潮把CSDN当成个人笔记也挺不错
第一篇博客,就是玩耍玩耍啦!

今天看见了eof函数的结尾判断问题,做了写小测试。 工具VS2017
首先创建一个txt文档里面包含3个数字数据

///光标位于第二行
测试代码

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main()
{ifstream in("D:/ss.txt");while (!in.eof()){int i;in >> i;cout << i << "$" << endl;}return 0;
}


///结果很明显,最后一个数据读了两遍也就是多了一次循环

///光标改到第一行

///现象消失

///改为竖直排列结果同上 若加一个回车则最后一个读取两遍
接下来更改i 的类型为string光标位于第二行
测试代码

#include<iostream>
#include<string>
#include<fstream>
using namespace std;
int main()
{ifstream in("D:/ss.txt");while (!in.eof()){string i;in >> i;cout << i << "$" << endl;}return 0;
}


///很明显多循环一次,但此次最后的数据1没有输出;
接下来给i赋一个初值”%%”并添加语句if(!i.empty())判断i是否为空

string i="%%";in >> i;if(!i.empty())


///可以发现最后一次的循环中in>>i是失败的,i的初值并没有被覆盖
光标调回第一行则不存在最后一次循环
或许在文件结束前流停在了回车符的位置所以多了最后一次循环?
编辑数据使数据调为竖直观察文件输入流是否会停留在回车符位置


///结果,输入流没有停留在回车符上过
编辑数据在最后一行数据加入一个回车符
结果多循环一次

以上所有测试换用函数peek()时结果一样
所以最后不知道能不能得到一个结论:文件结束处位于最后数据的下一行时,文件流会停在结束前的回车符一次使得输入循环多循环了一次。

接下来引入输入流迭代器重复实验
测试代码

#include<iostream>
#include<string>
#include<fstream>
#include<iterator>
using namespace std;
int main()
{ifstream in("D:/ss.txt");istream_iterator<int> pin(in), eof;while (pin!=eof){int i;i=*pin++;cout << i << "$" << endl;}return 0;
}


///无论光标位置在何处结果相同
将迭代器类型i类型改为string,并赋i初值为”%%”

///无论光标何处结果相同

总结:进行文件输入判断文件是否到达末尾时,使用io流迭代器可以避免重复循环;

令:在阅读C++ primer(第五版) 时书上关于输入流迭代器使用时 书上这么是这么用的

istream_iterator<int> in(cin),eof;
while(in!=eof)
{int i;i=*in++;cout<<i<<endl;
}

这会造成当输入两个数据时第一个数据才会被输出。原因是 i=*in++;相当于i=*in;in++; 所以再输入第二个数据时 输入流迭代器才会完成自加 接着输出第一个数据。
可以把迭代器的自加改到最后

While()
{int i;i=*in;cout<<i<<endl;in++;
}

这样及时输入的数据就能得到处理,而不必等待下一个数据输入才对第一个数据进行处理
PS:
若结束流迭代器输入的方式是Ctrl+Z ,若在while结束后还有其他输入操作,需要在while结束后,添加cin.clear();否则会造成其它输入错误;若结束方式为输入与流迭代器类型不相同的数据,则需要额外增加cin.ignore();否则会造成输入错误。

关于peek()与eof()函数。相关推荐

  1. ifstream eof()函数

    用ifstream的eof(),竟然读到文件最后了,判断eof还为false.网上查找资料后,终于解决这个问题. 参照文件:http://tuhao.blogbus.com/logs/21306687 ...

  2. c++ eof()函数

    C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本 ...

  3. 判断文件结束的几种方法和eof()函数

    看下面一段代码: ofstream ofs("a.txt"); int n = 1; while (--n) {     //不进入循环体   ofs<<n<&l ...

  4. C++ fstream流的eof()函数多读一行的问题

    最近帮老师带C++的课程设计,很多同学在使用很多fstream流的eof()函数进行 while(!readfile.eof()){readfile>>x;} 时,会出现将最后一行数据读两 ...

  5. 【c++基础】判断是否到文件末尾-eof函数

    前言 读取文件内容时,需要判断是否到文件末尾,此时用到eof函数. 函数定义 Check whether eofbit is set Returns true if theeofbiterror st ...

  6. 关于c和c++中的eof函数多读一个问题

    有不少人用eof函数碰到读多了一次的问题,但凡c/c++里的eof函数,比如feof,fstream对象的eof函数等等,都是相同的原理. 还原一下现场: #include<iostream&g ...

  7. C++文件操作之eof函数问题

    关于eof函数 fstream / ifstream / ofstream 类中的 成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0.原型是int eof(); 在使用这 ...

  8. C++中eof()函数和peek()函数的区别

    图书管理系统,实现对图书增,删,改,查的功能,这是初步想法,以后我会对这个项目进行更深的思考,毕竟现在还是菜鸡,先把最基础的干好. 这个可以替换上面的peek()函数 while(!infile.eo ...

  9. C++ eof()函数陷阱

    C++中用eof()检查是否到达文件结尾 分类: C 编程 2007-06-26 11:15 到达文件结尾有两种可能的解释: 一是当程序从一个文件读取数据时,在程序读取文件中的最后一项之后就立即出现文 ...

最新文章

  1. 25 张图读懂「文件系统」
  2. 基于pip的安装lxml库报错解决方案
  3. 三、Java Web中出现的一些乱码问题总结(详解)
  4. LoadRunner如何调用外部函数
  5. java 静态方法_80后程序员,教你学Java核心技术:用户自定义类+静态域静态方法
  6. java图片资源存放_Java编程中图片文件放哪
  7. 初学者指南:什么是算法?11行伪代码给你讲明白
  8. jquery ajax 跨域请求
  9. 浅谈JavaScript中forEach与each
  10. 你为什么选择计算机这个专业英语,怎样选择计算机专业,英文作文:为什么选择计算机作为你的专业...
  11. 通过实现ServletContextListener接口创建数据库连接池(C3P0方式)
  12. POJ1860Currency Exchange(SPFA)
  13. HDOJ--2000--ASCII码排序(java实现)
  14. 1.bootstrapTable data-table
  15. scratch3 打幽灵游戏
  16. 香港科大【526清水湾思享会@杭州】暨香港科大EMBA第四届校友会【浙江分会】启动仪式成功举行...
  17. 从「集装箱」思考Docker风潮
  18. python 股票行情系统_手把手教你用 Python 打造股票行情分析的 GUI
  19. 利用Xposed框架修改微信运动计步
  20. 支付宝接口的在线支付(https://openhome.alipay.com/platform/appDaily.htm?tab=info)

热门文章

  1. [附源码]计算机毕业设计右脑开发教育课程管理系统Springboot程序
  2. Linux基础学习之Day7-6-Mount 挂载详解
  3. blazeds TypeError: Error #1034: 强制转换类型失败
  4. spring版本与jdk版本兼容的问题
  5. 2014年4月19日
  6. MySql二进制文件解析系统
  7. 基于风险的测试学习总结
  8. 【读书笔记】赖世雄音标
  9. 终于将freepbx安装到 ubuntu 16.04 上去了, 最终得到是 freepbx 15. 分别装到两个地方, 都是ubuntu 16.04
  10. 1+1/2!+1/3!+…+1/20!