我正在尝试将矢量转换为流并返回。 虽然第一部分没有问题,但下面代码的最后一行是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));
答案 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
内的循环退出。