如何解决读取到文件末尾时碰到EOF导致的重复输出或者无用输出

摘要:
charch;fin.of()<“<failbit设置为1fin.close();fin.of())){ch=fin.get();fstream>intmain(){ifstreamfin(“.txt”);char ch;fin.off()){if(fin.get))cout<#include<usingspacestd;

当读取到文件末尾时,会碰到EOF,如何解决呢?
    方法一:我们可以通过(ch=fin.get())!=EOF来结束读取,这样就不会像eof()那样碰到EOF之后,还会再进行一次读取,导致输出一个无用的结束符或者重复前一字符

//a.txt中的内容为abc
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream fin("a.txt");
    char ch;
    while((ch=fin.get())!=EOF)                //到达文件结尾即停止读取    
    {
        cout<<ch;
    }
    
    cout<<"eofbit:"<<fin.eof()<<endl;        //文件指针到达文件末尾,因此eofbit被设置为1 
    cout<<"failbit:"<<fin.fail()<<endl;     //同理,failbit被设置为1 
    
    fin.close();
    
    return 0;
}

方法二:可以考虑将eof()与fail()结合起来使用来判断文件是否结束

//a.txt中的内容为abc
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream fin("a.txt");
    char ch;
    while(!fin.eof())
    {
        ch=fin.get();                //尝试读取EOF,此时eofbit被置为1,failbit也被置为1 
        if(fin.fail()) break;        //如果碰到EOF,则failbit被设置为1,因此fin.fail()返回true 
        cout<<ch;
    }
    fin.close();
    
    return 0;
}

方法三:可以通过get()函数读取EOF则失败来判断文件是否结束

//a.txt中的内容为abc
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ifstream fin("a.txt");
    char ch;
    while(!fin.eof())
    {
        if(fin.get(ch))
            cout<<ch;
    }
    fin.close();
    
    return 0;
}

方法四:判断文件指针相对于开头的位置,是否等于文件长度

//a.txt中的内容为abc
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    long filelen;
    ifstream fin("a.txt");
    fin.seekg(0, ios::end);
    filelen=fin.tellg();                        //获取文件长度
    fin.seekg(0, ios::beg);
    char ch;
    while(1)
    {
        if(filelen==fin.tellg()) break;            //判断文件指针相对于开头的位置是否等于文件长度
        ch=fin.get();
        cout<<ch;
    }
    fin.close();
    
    return 0;
}

免责声明:文章转载自《如何解决读取到文件末尾时碰到EOF导致的重复输出或者无用输出》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jmeter接口测试01ios代码实现时间设置NSDate下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ORACLE定时备份方案

ORACLE定时备份方案 采用ORACLE的EXP工具,实现ORACLE的备份;采用LINUX的服务crond实现定时功能。 1 编辑SH,实现备份功能 #vi oracle_backup.sh,输入以下内容 #!/bin/sh ORACLE_BACKUP_HOME=/home/oracle/backup   #定义ORACLE备份根目录 BACKUP_D...

《Win32多线程程序设计》学习笔记 第6章 Overlapped I/o 在你的身后变戏法

这章很重要,所以才把放到最后写,压轴,同时希望自己能认真的总结一下。这一章主要就是异步编程的内容,自己的理解 Overlapped I/O是win32的一项技术,你可以要求操作系统为你传送数据,并且在传送完毕时通知你。事实上,操作系统内部正是以线程来完成overlapped I/O,你可以获得线程的所有利益不需要付出什么代价。 Win32文件操作函数 wi...

实习小白::(转) 骨骼动画详解-Cocos Studio

  骨骼动画详解-Cocos Studio 在之前的骨骼动画详解-Spine一文中,我们已经介绍过什么是骨骼动画,骨骼动画的优缺点,以及骨骼动画编辑器-Spine的使用。接下来本文将结合另一个可编辑骨骼动画的编辑器(Cocos Studio)介绍骨骼动画的使用。 Cocos Studio介绍 Cocos Studio是一套基于Cocos2d-x的免费游戏开...

css动画之波纹

样式定义: #ContactAbout { height: auto; position: relative; overflow: hidden; } #sectioncontact { display: block; 100%; position: relative; height: 700px; z-index: 10; } #secti...

七牛镜像的使用

前段时间,team使用了七牛镜像的功能,用到了,就决定了解一下。 七牛官网的说明如下: 设置镜像存储,源站资源(文件/图片等)根据初次访问自动同步到七牛云存储,数据平滑迁移。可使用绑定的自定义域名访问镜像存储的源站资源。 配置镜像存储后,因为镜像源和镜像空间内容基本一致,将可能导致搜索引擎对源站进行封锁,可配置搜索引擎的 robots.txt 文件避免此情...

JAVA中使用动态链接库须知

好不容易 使用cygwin+windows打了个包,放到JAVA中使用。但是还是会报各种错。   JAVA中使用.so文件 static{ System.loadLibrary("test"); //加载libtest.so } 以上是网上的经典用法,很简单的一句。但是用的时候还是出错了。。。 主要还是.so路径找不到。找了大半天,终于,问题解决了...