eof()返回什么?

时间:2013-04-09 11:52:05

标签: c++ eof c-str

以下是代码:

string fname = "/home/jack/example.csv";
ifstream csvin(fname.c_str());
if (csvin.eof()) {
    do_something;
}

我的问题是:在什么情况下eof()返回true。我有以下选择:

  1. 文件不存在。
  2. 文件为空。
  3. 文件不存在或为空。
  4. 不幸的是documentation没有帮助,因为我不知道eofbit error state flag的意思。我也不明白End-of-File is reached in the sequence associated with the stream是什么意思。我假设c_str()返回一些迭代器,如果它已被某些东西使用,它可能已经到达它的结尾。但是,我感兴趣的是c_str()的结果是新鲜的简单情况,如果文件不存在会返回什么,如果文件为空则会返回什么?

    EDITED

    我只是想知道上面给出的代码在两种情况下返回的内容:

    1. 文件不存在。
    2. 文件为空。

4 个答案:

答案 0 :(得分:4)

当您正在读取的流中的位置已到达文件末尾时,

eof()将返回true。它实际上返回了 eof标志的值,该值在读取文件末尾(尝试读取过去)时设置。查看C++: .eof on an empty file以获取关于eof和空文件的讨论!

答案 1 :(得分:2)

如果设置了eofbit标志,则

eof返回true(表示在ifstream的情况下到达文件的末尾)。

当输入操作尝试读取流的末尾时,可以通过流上的所有输入操作(例如,read)设置eofbit标志(低:到达流的末尾) 。正如评论中所指出的那样,即使从概念上讲,只要读取了最后一个字符(或者没有读取空流上的任何内容),就会到达流的末尾,直到它尝试读取另一个字符时才知道该流。 。有关更多详细信息,请参阅每个输入操作的文档。

请注意,构造流不是输入操作,因此在您显示的代码示例中,eofbit在到达if语句时不会设置。 如果由于某种原因(例如,不存在的文件)构造流失败,则将设置failbit,可以使用fail进行检查。

编辑:看到你的编辑,我会更清楚地说明上述情况:

在您发布的代码中,if条件永远不会评估为true,因为ifstream构造函数未设置eofbit。

如果文件不存在,将设置failbit,您可以这样检查:

if (csvin.fail()) {
    // oops : failed to open the file for reading (file doesn't exist, or has the wrong permissions, or ...)
}

如果文件为空,则构造函数不会抱怨,但流上的第一个输入操作将设置eofbit。在第一次输入操作之后,您可以使用eof检查是否已到达文件的末尾。

答案 2 :(得分:1)

如果流上的上一个操作尝试读取文件的最后一个字节,则

eof()返回true。注意它会告诉你最后一次操作成功的事实,而不是下一次操作成功的事实。许多代码示例都做出了错误的假设,即它会告诉您有关下一个操作的信息,因此代码将无法按预期运行。

答案 3 :(得分:1)

实际上存在一定程度的实现依赖性 设置eofbit时的时间。 (函数eof()返回true 当且仅当eofbit已设置。)需要设置 如果,在阅读过程中(格式化或 未格式化的,呼叫streambuf::sgetc()(或其中一个 其他角色getters)返回std::char_traits::eof()。 并不总是清楚实现可能看起来如何 前面的字符 - 如果文件结束这样做,它 集eofbit;如果不进行预测,则不会。

我也不确定实施是否可以设置eofbit 如果它知道下一个读取必须返回eof, 没有实际阅读;我很确定 但是,现有的实现不会。 (你真的想要吗? 当你寻找到文件的末尾时设置eofbit?)所以在你的 例如,你几乎肯定不会看到eof()返回 真。

所有这些都解释了为什么你几乎从不做input.eof()(或 input.good(),其中包含eofbit的值 好)。在尝试打开文件后,通常的情况是 if ( input.is_open() )虽然input.fail()可以用作 好。在阅读已打开的文件时,我们进行测试 } 尝试输入后,通常使用 布尔上下文中的流对象(即input.fail()if ( input ))。 检测到故障后,我们可能会使用 if ( !input )确定失败的原因是否结束 当尝试输入时,文件或其他一些错误(如eof()"abc")。即使这样,它也不是100%绝对可靠的,int可能 即使格式中存在错误,也返回true。 (考虑:

eof()

在这种情况下,std::istringstream s( "1.3E+" ); double d; s >> d; 几乎肯定会返回true, 由于错误导致输入失败这一事实 由于文件结束,格式和。)