zoukankan      html  css  js  c++  java
  • 如何解决读取到文件末尾时碰到EOF导致的重复输出或者无用输出

    当读取到文件末尾时,会碰到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;
    }
  • 相关阅读:
    玩转Visual Studio Editor篇
    .Net2.0的集合操作 What i know?
    Log文件压缩
    [转]比较高效地实现从两个不同数组中提取相同部分组成新的数组(只支持Int类型) [C#]
    Stream 和 Byte[]互操作
    net 2.0 中如何在线程引发的事件中控制forms controls
    C# 操作Word文档(转)
    利用Lucene.net搜索引擎进行多条件搜索的做法
    c# 添加图片水印,可以指定水印位置+生成缩略图
    SDN第一次作业
  • 原文地址:https://www.cnblogs.com/kevinq/p/4492196.html
Copyright © 2011-2022 走看看