为什么多个输入迭代器会导致意外结果?

时间:2013-07-15 19:36:55

标签: c++ stl

以下是在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

从结果中,我们可以看到使用多个输入迭代器时,会产生意想不到的结果。 有人可以给我一个提示,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:3)

在24.6.1 / 1中回答:

  

类模板istream_iterator是一个输入迭代器(24.2.3)   读取(使用运算符&gt;&gt;)输入流中的连续元素   它是建造的。构建之后,每次都是++   使用时,迭代器读取并存储T的值。

因此,当您创建is1时,它会显示1。创建is2时,它会显示2,然后使用is1迭代文件的其余部分。最后,您从is2打印单个已提取的值,然后结束其迭代。