GCC 4.7 istream :: tellg()在达到EOF后返回-1

时间:2012-12-05 20:59:38

标签: c++ istream

以下代码适用于gcc 4.4 但是gcc 4.7会让断言失败。

#include <assert.h>
#include <iostream>
#include <sstream>

using namespace std;

int main()
{

    string input("abcdefg");
    stringstream iss(input);
    ostringstream oss;
    oss << iss.rdbuf();

    assert (!iss.eof());
    (void) iss.peek();
    assert (iss.eof());

    // the following assertion will fail with gcc 4.7
    assert( streamoff(iss.tellg()) ==
            streamoff(input.length()) );

    return 0;
}

在gcc 4.7中,如果istream已达到EOF,则tellg()将返回-1。不会调用pubseekoff()和seekoff() 在gcc 4.4中,这不是问题。

应该是行为,gcc 4.4还是gcc 4.7?为什么呢?

2 个答案:

答案 0 :(得分:5)

根据C ++ 11第27.7.2.3p40节,

  

如果fail() != false,则返回pos_type(-1)

因此gcc 4.7对于当前版本的C ++具有正确的行为(假设流末尾的peek()导致failbit被设置,并且它在哨兵构建期间执行,因为{{1} }默认设置)。

看看C ++ 03的措辞,它是一样的。 27.6.1.3p37。因此,您在gcc 4.4中描述的行为是一个错误。

答案 1 :(得分:2)

准确地说,eofbit不会导致tellg()返回-1。但是,如果设置了failbittellg(),那么您阅读过去 EOF的事实会设置-1badbit会返回failbit

解决方案是在调用tellg()之前清除状态标志:

iss.clear();
iss.tellg();  // should work