【问题标题】:eof of istream in C++C++ 中 istream 的 eof
【发布时间】: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.txttestcase2.txt,它们看起来完全一样,那为什么eofbit没有设置为testcase2.txt

【问题讨论】:

  • 会不会是vim追加了换行符?
  • @Alcott:它们可能看起来相同但略有不同。例如,您可以使用十六进制编辑器检查它们的内容是否完全相同......很可能不是。
  • @BjörnPollex,我在vim 中打开这两个文件,它们都是一行,看起来没有newlinewhitespace 附加,只是1.234
  • @Alcott,“新行”是行尾标记。即使你有一条线,你也有 NL。试试xxd your_file,你会看到0a 位是新行。
  • @Alcott 如果您想查看文件包含的确切字节,您可以使用十六进制编辑器查看文件。此外,末尾有换行符的文件会更大,因此ls 也会告诉您它们不相等。

标签: c++ eof istream


【解决方案1】:

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

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

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

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

要设置eof 位,您必须阅读PASS the 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 附加换行符?这是否意味着,如果我:set nu,它应该是2 行吗?
    • @Alcott no,这意味着EOF在下一行(不在数字所在的行)
    • @Alcott,没有。这意味着您在 vim 中有“设置 endofline”(默认为打开)。这会在文件末尾附加一个 NL。做一个:help eol
    • @Alcott:实际上,据我了解,文本文件的 Unix 约定是每一行都必须以换行符结尾。也就是说,从技术上讲,不以\n 结尾的文件不是有效的文本文件。由于\n 是它结束的行的一部分,因此它不会增加行数。相反,testcase1.txt 在技术上是不正确的。我也刚刚用wc 进行了测试,如果没有换行符,它会报告 zero 行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2017-10-18
    • 1970-01-01
    • 2012-10-23
    相关资源
    最近更新 更多