#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 ;
} int num,n=;
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 ;
}

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

  1. linux下EOF写法梳理

    在平时的运维工作中,我们经常会碰到这样一个场景:执行脚本的时候,需要往一个文件里自动输入N行内容.如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢 ...

  2. php定界符<<<EOF讲解(转)

    Heredoc技术.可用来输出大段的html和javascript脚本 1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西: 2.在PHP定界符中的任何特殊字符都不需要转义:  ...

  3. while(cin.eof)出错 poj

    zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了 楼下的代码可以通过zoj #include<iostream> using namespace std; int main(){ ...

  4. c++ eof()函数

    C++ eof()函数可以帮助我们用来判断文件是否为空,抑或是判断其是否读到文件结尾.在这里我们将会对其进行详细的介绍. C++编程语言中的很多功能在我们的实际应用中起着非常大的作用.比如在对文件文本 ...

  5. 【转】 解读EOF

    解读EOF 标签: fplinuxc语言filestream 2012-01-31 22:05 439人阅读 评论(0) 收藏 举报  分类: C.C++_程序设计(20)  我学习C语言的时候,遇到 ...

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

    首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getc ...

  7. Ext3文件系统mount选项和文件属性介绍

    mount选项 设置方式 ext3 mount选项可以通过多个方式进行设置:1)内核编译时: 内核menuconfig通过CONFIG_EXT3_DEFAULTS_TO_ORDERED编译控制选项,来 ...

  8. .NET 串口通信中断接收,包含0X1A(作为EOF)

    .NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...

  9. 常见的getchar 与EOF的问题

    代码中常有类似的如下的输入循环 char  c; while((c=getchar())!=EOF).... 如果输入 字符+换行时,循环的代码会执行两次,主要是换行键作为字符存到了缓存队列中,第一次 ...

  10. PHP eof的使用

    PHP eof的使用 也就是heredoc技术,来部分实现界面与代码的分离 <?php $name = '张三'; print <<<EOT <html> < ...

随机推荐

  1. Teclast/台电 P98HD四核测评9.7寸台电P98HD 评测体验 (转载)

    自从苹果新iPad上市推出后,拥有Retina高清屏幕分辨率的平板让我们的视线一下子变得“清晰”起来,超高2048x1536分辨率也成为厂商们追捧的对象,在经历了双核时代配备高清分辨率对于硬件性能承载 ...

  2. Delphi 常用属性说明(超长)

    Delphi组件的常用事件Onclick——当单击时触发这个事件中的代码Onchange——当改变该组件内容时触发其中的代码Oncreate——当创建时触发这个事件中的代码Onclose——当关闭的时 ...

  3. Hibernate 知识提高

    主键生成策略有: UUID,increment.Hilo.assigned:对数据库无依赖 identity:依赖Mysql或sql server,主键值不由hibernate维护 sequence: ...

  4. 【LeetCode】Flatten Binary Tree to Linked List

    随笔一记,留做重温! Flatten Binary Tree to Linked List Given a binary tree, flatten it to a linked list in-pl ...

  5. nyoj-709-异形卵(水题)

    异 形 卵 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 我们探索宇宙,是想了解浩瀚星空的奥妙.但我们却非常少意识到宇宙深处藏匿的危急,它们无时无刻不紧盯着我们的地球 ...

  6. UML初了解

    最近项目中有看UML图,很是模糊一些东西,今天查资料,发现这篇博文很好,转载了,也解了不少疑惑. 原文:http://www.uml.org.cn/oobject/201008311.asp 在绘画U ...

  7. java异常回顾

    String getMessage():返回此Throwable的详细消息字符串 void PrintStackTrace():将throw及其追踪输出至标准错误流 void printStackTr ...

  8. [Swust OJ 799]--Superprime Rib(DFS)

    题目链接:http://acm.swust.edu.cn/problem/799/ Time limit(ms): 1000 Memory limit(kb): 10000   Description ...

  9. BZOJ 1864: [Zjoi2006]三色二叉树( 树形dp )

    难得的ZJOI水题...DFS一遍就行了... ----------------------------------------------------------------------- #inc ...

  10. [转载]CSS 创作指南(Beta)(css规范)

    当年还在纠结各种规范的时候,不知道从哪里翻到这个,就让我脱离了css这个规范的苦海了... 反正就是团队和项目合作说的算,选择合适的进行使用就可以了,见到合适的文章,我也会转载过来的 来源 https ...