1

Linux で gcc4.8.1 を使用してコンパイルしたサンプル コードと結果を次に示します。

//content of test.txt
1 2 3 4 5 

int main()
{
    fstream fs ("test.txt", std::fstream::in );
    istream_iterator<string> is1(fs),eof1;
    istream_iterator<string> is2(fs),eof2;

    while(is1!=eof1){
        cout<<"is1:"<<*is1++<<endl;
    }
    while(is2!=eof2){
        cout<<"is2:"<<*is2++<<endl;
    }


    return 0;
}


//result unexpected    
$./m 
is1:1
is1:3
is1:4
is1:5
is2:2

結果から、複数の入力 iterator を使用すると、予期しない結果になることがわかります。なぜこれが起こるのか、誰かが私にヒントを与えることができますか?

4

1 に答える 1

3

これは 24.6.1/1 で回答されています。

クラス テンプレート istream_iterator は入力イテレータ (24.2.3) であり、それが構築された入力ストリームから連続する要素を (operator>> を使用して) 読み取ります。構築後、++ が使用されるたびに、反復子は T の値を読み取って格納します。

したがって、作成するis1と読み取ります1。作成するis2と読み取り2、ファイルの残りの部分をis1. 最後に、すでに抽出された単一の値を出力しis2、その反復を終了します。

于 2013-07-15T20:09:01.823 に答える