C ++中istream的eof

时间:2012-01-11 07:32:04

标签: c++ eof istream

bool ios::eof ( ) const;

据图书馆说,

  

如果eofbit流的错误标志已经存在,则该函数返回true   由先前的i / o操作设置。该标志由所有标准设置   在序列中到达文件结尾时的输入操作   与流相关联。

我写了一个程序来运行一些测试:

int main(int argc, char *argv[])
{
    ifstream ifs(argv[1]);
    float f;
    ifs >> f;

    cout << ifs.eof() << endl; //check if eofbit set

    ifs.close();
}

我测试了2个文件testcase1.txt和testcase2.txt。

testcase1.txt在终端中使用cat生成,[Ctrl-D]用于结束输入:

[~/C++ $] cat > testcase1.txt
1.234[Ctrl-D]

testcase2.txt是在vim中生成的,我打开了vim并输入了1.234,然后保存并退出。

测试结果

testcase1.txt的测试结果为1,表示设置了eofbit

[~/C++ $] ./a.out testcase1.txt
1

testcase2.txt的测试结果为0

[~/C++ $] ./a.out testcase2.txt
0

我在testcase1.txt中打开了testcase2.txtvim,它们看起来完全相同,那么eofbit未设置为testcase2.txt的原因是什么?< / p>

2 个答案:

答案 0 :(得分:2)

vim将在文件末尾添加一个新行。这就是为什么没有达到EOF的原因。

答案 1 :(得分:2)

正如您在评论中看到的那样,有一个新行:

ifstream ifs(argv[1]);
float f;
ifs >> f;
char c;
ifs.get( c ); // this will get '\n'

即便如此,EOF仍然不会设置....阅读你再次引用的段落:

  

如果eofbit流的错误标志已经存在,则该函数返回true   由之前的i / o操作设置。该标志由所有标准设置   在序列中到达文件结尾时的输入操作   与流相关联。

要设置eof位,您必须阅读通过eof。如果需要,您可以使用peek()来执行此操作。

ifstream ifs(argv[1]);
float f;
ifs >> f;
char c;
ifs.get( c ); // this will get '\n'
ifs.eof();  // this is false;
ifs.peek();
ifs.eof(); // this is true

另请参阅:istream::peek curious behavior wrt. EOF