6

次のコードはgcc4.4で動作します。
ただし、gcc4.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()も呼び出されません。gcc4.4では問題ありません。

gcc4.4とgcc4.7のどちらの動作が想定されていますか?なんで?

4

2 に答える 2

5

C ++ 11セクション27.7.2.3p40によると、

の場合fail() != falsepos_type(-1)

したがって、gcc4.7は現在のバージョンのC++に対して正しい動作をします(peek()ストリームの最後でfailbitが設定されると仮定し、デフォルトで設定されているため、歩哨の構築中にも動作skipwsします)。

C ++ 03の言い回しを見ると、同じです。27.6.1.3p37。したがって、gcc4.4で説明する動作はバグです。

于 2012-12-05T21:04:44.983 に答える
2

正確には、を返さeofbitないようにします。ただし、過去のEOFを読み取ったという事実は、を設定し、またはが設定されている場合は戻ります。tellg()-1failbittellg()-1badbitfailbit

解決策は、呼び出す前にステータスフラグをクリアすることtellg()です。

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