无法解释为什么std :: istream_iterator将std :: ios_base设置为错误状态

时间:2010-03-02 17:24:48

标签: c++

我正在尝试将矢量转换为流并返回。 虽然第一部分没有问题,但下面代码的最后一行是std :: ios_base是错误状态。你知道为什么会这样吗? 显然代码执行后,myVecOut等于myVec ....

    std::vector<double> myVec( 3 );
    std::stringstream temp;
    std::copy(myVec.begin(), myVec.end(), std::ostream_iterator<double>(temp, " "));
    std::cout << temp.str() << std::endl;
    std::vector<double> myVecOut;
    std::copy(std::istream_iterator<double>(temp), std::istream_iterator<double>(), std::back_inserter(myVecOut));

1 个答案:

答案 0 :(得分:3)

它已设置为fail状态,因为copy不知道要读取多少项。只要流处于 .good() .fail()状态,它就会读取。在跳过最后一个空格时,它会结束,并设置eof(因为它试图超越结束时读取)和fail(因为它无法读取它想要的双倍)。

之后调用.clear()以清除这些错误位。


比较不等于.good()的迭代器之间的差异是真的而.fail()为假是istream_iterator即使流在{{1}中也会继续前进国家。以下进一步检查它:

eof

现在,在我们读取“2.2”之后,std::stringstream a; a << "1.1 2.2"; std::copy(std::istream_iterator<double>(a), std::istream_iterator<double>(), std::ostream_iterator<double>(std::cout, " ")); 状态被设置(因为它试图读取超过“2”)。但是开始和结束迭代器还不会比较相等,因为eof状态未设置,因此fail不返回true(而.fail()将返回false,因为它另外考虑.good()。只有在下一次读取之后,当它再也无法读取另一个double时,.eof()状态被设置,而然后迭代器比较相等,并且fail内的循环退出。