关于C++ 的eof

#include<iostream>
#include<fstream>

#define MAXSIZE 1000

using namespace std;

int main()
{
    int a[MAXSIZE];
    ifstream fin("input.txt");
    if( !fin.is_open() )
    {
        cout<<"open file error"<<endl;
        return 0;
    }

    int num,n=0;
    while( !fin.eof() )
    {
        fin>>num;
        if(fin.good())
        {
            a[n++] = num;
        }
    }
}

【问题】

  使用以上代码,最后会多输入一个数。循环明明是通过判断,eof,是否是文件尾来终止的,可是却会多长一个数字。在网上搜了相关的问题。原因大概是这样的:

  这是由于C++输入输出流判断末尾的方式不一样,根据是:当 fin>>num 不能再读入数据时,才能发现到了文件结尾,这是才会给输入文件流设置文件结尾标志,即eofbit标志,参会返回true。若此时 num 是文件中的最后一个数字,那么在读入该数字之后,eofbit 是不会马上被设置的,因为此时可以正常输入最后一个数字,fin流会认为文件还没有到末尾,所以while循环中 fin.eof() 为false,还要执行一次,这是数据已被读完,所以继续进行fin>>num,则会多出一个数字,这有可能是最末尾一个数字重复出现,也可能是其它奇怪的数字,这个时候fin才能发现文件到达末尾,进而设置 eofbit 标志,跳出循环,但是在此之前已经多读入一个多余的数字了。

    简单来说,就是 fin 在读入最后一个数字的时候,eof() 还是为 FALSE,只有当最后一个数字读入以后,再次使用fin输入,才能发现到达文件末尾,eof() 才为true。

【解决方案】

(1)

int num,n=0;
    while( !fin.eof() )
    {
        fin>>num;
        if(fin.good())
        {
            a[n++] = num;
        }
    }

(2)

int num,n=0;
    while( !fin.eof() )
    {
        fin>>num;
        if(fin.fail())
        {
            a[n++] = num;
        }
    }

(3)

peek 函数只适用于字符,也就是char类型,对于str类型,和int类型,我试过都不行,还是会对出一个。

char c;
while(fin.peek()!=EOF)
{
        fin >> c;
        cout << c ;
}

时间: 2024-10-27 20:36:39

关于C++ 的eof的相关文章

[转载]C语言EOF是什么?

原贴网址:http://www.kuqin.com/language/20111112/314745.html 收藏于此: 我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin). 比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上. int c; while ((c = fgetc(fp)) != EOF)

访问网站出现EOF

HTTP/0.0 503 Service Unavailable Date: Tuesday, 18-Apr-17 10:29:46 CST Keep-Alive: timeout=38 EOF 今天访问本地的项目,全部提示上面的那些信息EOF,不知道咋回事? 之前都都能正常访问,所以我猜想本地的项目本身肯定是没有问题的. 原因:代理软件-蓝灯(由于自己经常上Google,所以下载使用了蓝灯免费版使用) 我的解决方法: 1.关掉代理软件即可 2.给你本地的项目更换域名,重新绑定host即可 延伸

C语言EOF

验证表达式getchar()!=EOF的值是1还是0 编写一个打印EOF值的程序 windows下是ctrl-z 就是ctrl和z一起按了,就是结束符linux下是ctrl-d是结束符.这个是一个特殊的值,一般是-1 区分文件中有效数据与输入结束符.C语言采用的解决办法是:在没有输入时,getchar函数将返回一个特殊值,这个特殊值与任何实际字符都不同.这个值称为EOF(end of file,文件结束)

EOFError:EOF when reading a line

Sublime2编译Python程序EOFError:EOF when reading a line: 是因为Sublime2对于python中运行含有input或者raw_input的python代码时候会报错. 就是Sublime中,运行python代码时,暂不支持输入参数.如果代码中包含用户输入的函数时(eg. raw_input())Command+b编译运行之后会提示以下错  误: 解决方案, 安装SublimeREPL插件 windows下: 打开Sublime Text2编辑器,按

&#39;0&#39;,&#39;\0&#39;,NULL,EOF的区别

要看是不是一个东西,打印一下即可 printf("%d %d %d %d\n",'0','\0',NULL,EOF); 输出: 48 0 0 -1 结论: '\0'与NULL 都是0,所以有的时候可以这样用: 初始化指针 char* p=0; 初始化字符串 char tmp[10] = {0} 或 memset(tmp,0,10) '0','\0',NULL,EOF的区别

诡异的EOF Exception

近日在写一个简单的HTTP代码中遇到了诡异的EOFException,当读取ResponseCode的时候就抛出了EOF异常,感觉很诡异,下面进行问题还原,以及分析和解决过程. 问题 有问题的代码如下: 点击阅读全文

雪泥鸿爪-教学中的debug(13) EOF与换行符

http://oj.hi-hi.cn/JudgeOnline/problem.php?cid=1088&pid=9 问题 J: 实验8_5:统计元音字母个数 题目描述 编写一程序,用于统计从键盘输入的字符串中的元音字母(a,A,e,E,i,I,o,O,u,U)的个数. 输入 每行输入一字符串 输出 输出对应字符串中元音字母的个数. 样例输入 abcio efgaeio ak akkkksd 样例输出 3 5 2 学生问, 请问这个错在哪儿?样例输出是正确的啊 1 #include<stdio

【学生信息管理系统】EOF 和 BOF

敲完学生信息管理系统时,在删除信息的时候,经常会出现下图这样的错误,遇到问题就要解决问题.经过查阅理解了记录集Recordset的EOF和BOF属性,用这两个属性可以知道记录集中是否有信息存在. EOF和BOF属性 BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前. EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后. 返回值:BOF 和 EOF 属性返回布尔型值. 使用 BOF 和 EOF 属性可确定Recordset 对象是否包含记录,或者从一个记

EOF:getchar()函数返回的一个特殊值

EOF 是个宏,其意思是:End Of File,文件尾标志. 从数值上来看,就是整数-1在C语言的头文件中对其进行了宏定义:libio.h: # define EOF (-1)当读文件操作时,遇到文件结束位置或读数据出错均会返回 EOF. (C语言中所有的输入输出操作均是按读文件的思想来设计的,或者说,是文件操作的一种特例,如getchar()就是fgetc(stdin) 的一个宏 )int getchar() ; //从标准输入缓冲区读取一个字符,成功返回该字符的ASCII值,出错,返回EO

Linux C 字符函数 getchar()、putchar() 与 EOF 详解

首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getchar(); while (c != EOF) { putchar(); c = getchar(); } return 0; } 这里主要解释下为什么要用int型来接受getchar函数. 很多时候,我们会写这样的两行代码: char c; c = getchar(); 这样就很有可能出现问题.因为getc