6

以下代码适用于 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?为什么?

4

2 回答 2

5

根据 C++11 第 27.7.2.3p40 节,

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

因此 gcc 4.7 对于当前版本的 C++ 具有正确的行为(假设peek()在流结束时failbit设置,并且它在哨兵构造期间进行,因为skipws默认设置)。

看C++03的写法,也是一样。27.6.1.3p37。所以你在 gcc 4.4 中描述的行为是一个错误。

于 2012-12-05T21:04:44.983 回答
2

准确地说,eofbit不会导致tellg()return -1但是您阅读过去EOF的事实设置了failbit, 并且如果设置了ortellg()将返回。-1badbitfailbit

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

iss.clear();
iss.tellg();  // should work
于 2016-01-22T14:03:28.327 回答