tetou 发表于 2015-6-10 21:09:27

c++读取文件eof的疑惑

对于文本文件,当我们使用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中ConstantsfortheStateofStreams有一个表如下:
既然知道问题所在,问题就好解决了。方法一: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 thestream 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

页: [1]
查看完整版本: c++读取文件eof的疑惑