如何解决读取到文件末尾时碰到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;
}
时间: 2024-08-02 18:51:59

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

java读取.properties文件及解决中文乱码问题

Java项目中有些信息(例如web的配置信息)可能要放在.properties文件中,那我们应该怎么来读取它们呢,下面给出一个工具类做一说明,并解决了中文乱码问题: 1.其中config.properties文件信息如下: name=\u843D\u82B1\u6709\u610Fwang王 str=\u6D41\u6C34\u65E0\u60C5 boolean=true 2.PropertiesUtil工具类读取.properties文件 import java.io.BufferedInp

文件流结尾的EOF详解

我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin). 比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上. int c; while ((c = fgetc(fp)) != EOF) { putchar (c); } 很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统

【 D3.js 进阶系列 — 1.2 】 读取 CSV 文件时乱码的解决方法

在 D3 中使用 d3.csv 读取 CSV 文件时,有时会出现乱码问题.怎么解决呢? 1. 乱码问题 使用 d3.csv 读取 xxx.csv 文件时,如果 xxx.csv 文件使用的是 UTF-8 编码,不会有什么问题.当然,个人认为尽量使用 UTF-8 编码,可以在同一编码内使用各国文字. 但是,如果 xxx.csv 文件使用的是 utf-8 编码,使用 Microsoft Excel 打开的时候,可能会出现乱码,因为国内的 Excel 默认使用 GB2312 打开,而且在打开的时候不能选

spring使用@Value注解读取.properties文件时出现中文乱码问题的解决

解决办法 在spring中我们常常使用.properties对一些属性进行一个提前配置, spring 在读取*.properties文件时, 默认使用的是asci码, 这时 我们需要对其编码进行转换. 下面列举两种常见的方法. 方法一:在配置spring.xml文件时,声明所需的∗.properties文件时直接使用"utf−8"编码 <context:property-placeholder location="classpath:conf/*.properties

Java读取Unicode文件(UTF-8等)时碰到的BOM首字符问题,及处理方法

在Windows下用文本编辑器创建的文本文件,如果选择以UTF-8等Unicode格式保存,会在文件头(第一个字符)加入一个BOM标识. 这个标识在Java读取文件的时候,不会被去掉,而且String.trim()也无法删除.如果用readLine()读取第一行存进String里面,这个String的length会比看到的大1,而且第一个字符就是这个BOM. 这种情况会造成一些麻烦,比如在读取ini文件的时候,如果想判断第一行是不是以"["开头就无法正确判断. 幸好,Java在读取Un

解决使用{freopen与 getline}读取不同文件时产生的的问题

读取单一文件 使用 freopen重定向. 用 getline逐行读取,处理. #include <iostream> #include <cstdio> #include <cstring> using namespace std; string s; int main() { freopen("text1.in", "r", stdin); while (getline(cin, s)) { /* - code - */ }

全面解决.Net与Java互通时的RSA加解密问题,使用PEM格式的密钥文件

一.缘由 RSA是一种常用的非对称加密算法.所以有时需要在不用编程语言中分别使用RSA的加密.解密.例如用Java做后台服务端,用C#开发桌面的客户端软件时.由于 .Net.Java 的RSA类库存在很多细节区别,尤其是它们支持的密钥格式不同.导致容易出现“我加密的数据对方不能解密,对方加密的数据我不能解密,但是自身是可以正常加密解密”等情况.虽然网上已经有很多文章讨论 .Net与Java互通的RSA加解密,但是存在不够全面.需要第三方dll.方案复杂 等问题.于是我仔细研究了这一课题,得到了一

wcf文件上传时碰到的配置问题

1.远程服务器返回了意外相应:(413) Request Entity Too Large 修改客户端配置maxReceivedMessageSize="2147483647" <bindings> <basicHttpBinding> <binding name="BasicHttpBinding_WcfService" maxBufferSize="2147483647" maxReceivedMessageSi

Android SDK安装时碰到的问题之解决办法

问题: hostname in certificate didn't match: <dl-ssl.google.com> != <www.google.com> Fetching URL: https://dl-ssl.google.com/android/... 解决办法: 第一步: 打开Windows中C:\WINDOWS\system32\drivers\etc\hosts,Linux中/etc/hosts文件,然后添加以下内容: 203.208.46.146 dl.goo