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

从结果中我们可以看出,当使用多个输入迭代器时,它会给出意想不到的结果。有人能告诉我为什么会发生这种情况吗?

4

1 回答 1

3

这在 24.6.1/1 中得到了回答:

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

因此,当您创建is1它时,它会读取1. 当您创建is2它时,它会读取2,然后您使用is1. 最后,您打印单个已提取的值is2,然后结束其迭代。

于 2013-07-15T20:09:01.823 回答