特投网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

(站外) 特投工作室

查看: 6201|回复: 0

c++读取文件eof的疑惑

[复制链接]

2583

主题

1018

回帖

7万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
70059
QQ
发表于 2015-6-10 21:09:27 | 显示全部楼层 |阅读模式

对于文本文件,当我们使用eof()判断文件是否结束时会多读一次(c语言也有类似的情况),或许你有遇到过这种情况。

先看下面的例子吧:

点击(此处)折叠或打开

  • #include<iostream>
  • #include <string>
  • #include<fstream>
  • #include<cstdlib>
  • using namespace std;
  • int main()
  • {
  •     char data;
  •     ifstream infile;
  •     infile.open("in.txt");
  •     if(infile.fail())
  •     {
  •         cout<<"Fail to open the input file"<<endl;
  •         exit(1);
  •     }
  •     while( !infile.eof() )
  •     {
  •         infile >> data;
  •         cout << data ;
  •     }
  •     infile.close();
  •     cout << endl;
  •     return 0;
  • }




假设输入文件in.txt的内容为:

abc

则输出结果是:abcc

明明使用了eof()判断了,为什么还是这样的呢?原因是这样的,因为eof()发现读到文件结束标志EOF(即-1)时并不会立刻返回true,

而是比较后知后觉。此时需要再读一下,这时eofbit才被设置(并且设置其他的bit,如goodbit),等下次调用eof()时才返回true。 C++ Standard Library中Constants  for  the  Stateof  Streams有一个表如下:

27034868_13705233929lal.jpg

既然知道问题所在,问题就好解决了。

方法一:

while( !infile.eof() )

{

infile >> data;

if( infile.good()

{

cout << data ;

}

}

或者:

while( !infile.eof() )

{

infile >> data;

if (infile.fail())

                {

                        break;

                }

cout << data ;

}

方法二:

while(infile >> data)

{

        cout << data ;

}

方法三:使用peek函数

while(infile.peek()!=EOF)

{

        infile >> data; //用>>读取时会忽略(跳过)空格等空字符,使用infile.get(data)不会

        cout << data ;

}

peek()只是查看缓冲的下一个元素,并不读取(即文件内部指针不会向后移动),c++ Standard Library中有一句描述:

Returns the next character to be read from the  stream without extracting it.

可以看出peek有一个局限,只能在读取char类型时使用。

例如,in.txt内容为以空格隔开的字符串,因为我们在程序中写入文件时,每写入一个字符串之后跟一个空格,所以最后一个字符串之后有空格:

string str;

while(infile.peek()!=EOF)

{

        infile >> str;

        cout << str << endl;

}

同样会多读一次, 不信可以试试看,呵呵。至于如何解决,我想你应该能够举一反三了吧。



原文地址:http://blog.chinaunix.net/uid-27034868-id-3758629.html

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

您尚未登录,请登录后浏览更多精彩内容!
 立即注册
找回密码

QQ|Archiver|手机版|小黑屋|特投网 ( 皖ICP备13010674号-1 

GMT+8, 2024-12-22 02:08 , Processed in 0.031194 second(s), 12 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表