【发布时间】:2012-01-11 07:32:03
【问题描述】:
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();
}
我测试了两个文件,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
我在vim中打开testcase1.txt和testcase2.txt,它们看起来完全一样,那为什么eofbit没有设置为testcase2.txt?
【问题讨论】:
-
会不会是vim追加了换行符?
-
@Alcott:它们可能看起来相同但略有不同。例如,您可以使用十六进制编辑器检查它们的内容是否完全相同......很可能不是。
-
@BjörnPollex,我在
vim中打开这两个文件,它们都是一行,看起来没有newline或whitespace附加,只是1.234。 -
@Alcott,“新行”是行尾标记。即使你有一条线,你也有 NL。试试
xxd your_file,你会看到0a位是新行。 -
@Alcott 如果您想查看文件包含的确切字节,您可以使用十六进制编辑器查看文件。此外,末尾有换行符的文件会更大,因此
ls也会告诉您它们不相等。