#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. POJ 3630 Phone List(trie树的简单应用)

    题目链接:http://poj.org/problem?id=3630 题意:给你多个字符串,如果其中任意两个字符串满足一个是另一个的前缀,那么输出NO,否则输出YES 思路:简单的trie树应用,插 ...

  2. Hibernate学习之延迟加载

    转自:http://www.cnblogs.com/xiaoluo501395377/p/3371776.html 在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通 ...

  3. java 读文件 解析

    [Java]读取文件方法大全   1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile {     /**     ...

  4. [LeetCode]题解(python):003-Longest Substring Without Repeating Characters

    题目来源: https://leetcode.com/problems/longest-substring-without-repeating-characters/ 题意分析: 题目是要求出最长的不 ...

  5. python的内置函数bin()

    bin(x) 中文说明:将整数x转换为二进制字符串,如果x不为Python中int类型,x必须包含方法__index__()并且返回值为integer: 参数x:整数或者包含__index__()方法 ...

  6. HTML+CSS笔记 CSS入门

    简介: </span>年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的<span>脚本解释程序</span>,作为ABC语言的一种继承. & ...

  7. bootstrap读书笔记

    引入bootstrap.js或单个插件的js文件 若引入单个插件的js文件,注意插件之间的依赖关系 data属性api data属性的api很方便,但我们也可以选择关闭这个功能:$(document) ...

  8. HDU 2815 Mod Tree

    不会,先搁着…… http://blog.csdn.net/acm_cxlove/article/details/7832197

  9. Ext JS学习第十天 Ext基础之动态加载JS文件(补充)

    此文用来记录学习笔记: •Ext4.x版本提供的一大亮点就是Ext.Loader这个类的动态加载机制!只要遵循路径规范,即可动态加载js文件,方便把自己扩展组件动态加载进来,并且减轻浏览器的压力. • ...

  10. TextBox控件只允许输入出生日期,并验证年龄不得小于18岁

    1.Body tag <form id="form1" runat="server"> <div> <asp:Label ID=& ...