繁体   English   中英

当达到流的EOF时,seekg()不会设置eofbit。 是设计使然吗?

[英]seekg() does not set eofbit when reaching EOF of a stream. Is it by design?

编辑:我的原始测试程序代码中有一个微妙的错误: " char=" << aStream.peek()行(也可能是" input pos=" << aStream.tellg() )修改了流状态标志,因此未报告真实状态。 因此,必须从代码中完全删除这些调用,否则我们将看不到seekg()对状态标志的实际影响。 但是结果仍然相同:未设置eofbit

原始帖子:

我尝试通过调用将输入指针前进1步来检测std::istream的EOF

seekg( 1, std::ios_base::cur )

然而seekg()移动超出EOF 1点的位置,当它设置failbit流的。 永远不会设置eofbit 查看此测试程序的输出:

#include <iostream>
#include <sstream>

using namespace std;

void info( int aRelativePos, istream& aStream )
{
    cout << "POS=" << aRelativePos <<
            " input pos=" << aStream.tellg() <<
            " char=" << aStream.peek() <<
            "\tGood: " << aStream.good() <<
            " Eof: " << aStream.eof() <<
            " Bad: " << aStream.bad() <<
            " Fail: " << aStream.fail() << "\n";
}

int main()
{
    istringstream   input ("12");

    int i=0;
    while ( input.good() )
    {
        info( i, input );
        input.seekg( 1, std::ios_base::cur ); //advance 1 step forward
        ++i;
    }
    info ( i, input );

    return 0;
}

输出:

POS=0 input pos=0 char=49   Good: 1 Eof: 0 Bad: 0 Fail: 0
POS=1 input pos=1 char=50   Good: 1 Eof: 0 Bad: 0 Fail: 0
POS=2 input pos=-1 char=-1  Good: 1 Eof: 0 Bad: 0 Fail: 0
POS=3 input pos=-1 char=-1  Good: 0 Eof: 0 Bad: 0 Fail: 1

(由带有-std=c++11的gcc 5.2编译。您可以在此处运行以下代码: http : //coliru.stacked-crooked.com/a/69f4d70e93359423

此外,关于seekg MS文档( https://msdn.microsoft.com/zh-cn/library/y2d6fx99(v=vs.120).aspx )指出,C ++标准不支持文本文件中的相对定位。

但是我在标准中找不到这样的信息。 你能给我参考吗?

只要您对标准表示满意,这就是我们从[istream.unformatted]获得的行为

basic_istream<charT,traits>& seekg(pos_type pos);

效果:表现为未格式化的输入函数(如27.7.2.3,第1段中所述),不同之处在于该函数首先清除eofbit ,它不计算提取的字符数,并且不影响后续对的调用返回的值。 gcount() 构造哨兵对象后,如果fail() != true ,则执行rdbuf()->pubseekpos(pos, ios_base::in) 如果发生故障,该函数将调用setstate(failbit) (可能会引发ios_base::failure )。

因此,按照标准,我们将始终清除eofbit并且在发生故障时仅设置故障位。 尝试读取失败结束之后就是失败,所以这就是为什么要设置它。 仅到达文件末尾并不是失败,因为末尾是有效位置。

您可以在此示例中(从您的代码修改而来)看到,一旦我们到达文件末尾,我们仍然会很好,然后尝试从那里读取不仅会设置eofbit ,还会设置eofbit failbit就像我们在文件末尾一样。提取失败

input.seekg(0, std::ios::end);
info (input);
char ch;
input >> ch;
info (input);

输出:

Good: 1 Eof: 0 Bad: 0 Fail: 0
Good: 0 Eof: 1 Bad: 0 Fail: 1

现场例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM