码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-10 15:31:51      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

当读取到文件末尾时,会碰到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导致的重复输出或者无用输出

标签:

原文地址:http://www.cnblogs.com/kevinq/p/4492196.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!