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.txt
和vim
,它们看起来完全相同,那么eofbit
未设置为testcase2.txt
的原因是什么?< / p>
答案 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