C++ eof()返回什么?

C++ eof()返回什么?,c++,eof,c-str,C++,Eof,C Str,代码如下: string fname = "/home/jack/example.csv"; ifstream csvin(fname.c_str()); if (csvin.eof()) { do_something; } 我的问题是:在什么情况下,eof()返回true。我有以下选择: 文件不存在 文件为空 文件不存在或为空 不幸的是,这没有帮助,因为我不知道eofbit错误状态标志的意思。我也不明白在与流相关联的序列中到达文件末尾是什么意思。我假设c_str()返回某个迭代器,如

代码如下:

string fname = "/home/jack/example.csv";
ifstream csvin(fname.c_str());
if (csvin.eof()) {
    do_something;
}
我的问题是:在什么情况下,
eof()
返回true。我有以下选择:

  • 文件不存在
  • 文件为空
  • 文件不存在或为空
  • 不幸的是,这没有帮助,因为我不知道
    eofbit错误状态标志的意思。我也不明白在与流相关联的序列中到达文件末尾是什么意思。我假设c_str()返回某个迭代器,如果它已经被某个对象使用,那么它可能已经到达了终点。然而,我感兴趣的是当
    c_str()
    的结果是新的时,如果文件不存在,它将返回什么?如果文件为空,它将返回什么

    已编辑

    我只想知道上面给出的代码在两种情况下返回了什么:

  • 文件不存在
  • 文件为空

  • eof()当正在读取的流中的位置到达文件末尾时,返回true。它实际上返回读取文件结尾(试图读取过去)时设置的eof标志的值。查看有关eof和空文件的讨论

    eof
    如果设置了eofbit标志(表示在
    ifstream
    的情况下到达文件末尾),则返回
    true

    当输入操作尝试读取超过流的结尾(iow:到达流的结尾)时,流上的所有输入操作(例如,
    读取
    )都可以设置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
    检查是否达到了文件的结尾。

    eof()
    如果流上的最后一次操作试图读取文件的最后一个字节,则返回
    true
    。请注意这样一个事实:它告诉你上一次手术的成功,而不是下一次手术的成功。许多代码示例错误地假设它告诉您有关下一个操作的一些信息,因此代码的行为将与预期不符。

    实际上还有一小部分实现依赖性 设置了
    eofbit
    时设置为。(函数
    eof()
    返回true 当且仅当设置了
    eofbit
    时。)需要进行设置 如果,在阅读过程中(格式化或 未格式化),调用
    streambuf::sgetc()
    (或 其他字符获取程序)返回
    std::char\u traits::eof()
    。 何时实现可能会出现这种情况并不总是很清楚 字符在前面,如果它得到文件的结尾,则 设置
    eofbit
    ;如果它不做前瞻,它就不会

    我也不确定实现是否可以设置
    eofbit
    如果知道下一次读取必须返回
    eof
    , 没有读过书;我相当肯定 然而,现有的实现没有这样做。)你真的想要吗
    eofbit
    在查找文件结尾时设置)因此在 例如,您几乎肯定不会看到
    eof()
    返回 对

    所有这些都解释了为什么您几乎从不执行
    input.eof()
    (或
    input.good()
    ,它在其值中包含
    eofbit
    ,如下所示: 嗯)。尝试打开文件后,通常情况是
    if(input.is_open())
    ,尽管
    input.fail()
    可以用作 好。当读取一个已经打开的文件时,我们测试
    input.fail()
    在尝试输入之后,通常使用 布尔上下文中的流对象(即
    if(输入)
    ,或
    if
    (!输入)
    )。在检测到故障后,我们可以使用
    eof()
    以确定故障原因是否为结束 文件的错误,或尝试输入时出现的其他错误(如
    “abc”
    ) 一个
    int
    )。即使如此,它也不是100%无误的,而且
    eof()
    may 即使格式中有错误,也返回true。 (考虑:

    std::istringstream s( "1.3E+" );
    double d;
    s >> d;
    
    在这种情况下,
    s.eof()
    几乎肯定会返回true, 显示由于输入中的错误而导致输入失败的事实
    通常,它是这样写的:(!csvin.eof()){do_something();}@Gearoid No.除非是“通常”,你的意思是“通常,在不完整的代码中”,你的文档会让你陷入一个循环,就像那个网站经常做的那样。把这个网站当作你的第一个来源。如果文件不存在,
    csvin
    无效,您不应该首先尝试对其调用
    eof()
    。@DevSolar:
    csvin
    将是一个完全构造的对象,因此对其调用任何方法(包括
    eof
    )都是定义良好的(alb)