关于peek()与eof()函数。

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

今天看见了eof函数的结尾判断问题,做了写小测试。 工具VS2017
首先创建一个txt文档里面包含3个数字数据
图1
///光标位于第二行
测试代码

#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;
}

图2
///结果很明显,最后一个数据读了两遍也就是多了一次循环
图3
///光标改到第一行
图4
///现象消失
图4
///改为竖直排列结果同上 若加一个回车则最后一个读取两遍
接下来更改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;
}

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

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

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

以上所有测试换用函数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;
}

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

总结:进行文件输入判断文件是否到达末尾时,使用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();否则会造成输入错误。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值