gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:11:19 24 4
gpt4 key购买 nike

我正在尝试将 vector 转换为流并返回。虽然第一部分没有问题,但以下代码的最后一行 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));

最佳答案

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

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


.good() 为 true 和 .fail() 为 false 时比较不相等的迭代器之间的区别是 istream_iterator 即使流处于 eof 状态,它仍会前进。下面进一步考察:

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.2”之后,设置了 eof 状态(因为它试图读取超出“2”的内容)。但是 begin 和 end 迭代器还不会比较相等,因为未设置 fail 状态,因此 .fail() 不会返回 true(而 .good() 会返回 false,因为它还考虑了 .eof())。只有在下一次读取之后,当它无法再读取另一个 double 时,才会设置 fail 状态,then 迭代器比较相等,并且 std 中的循环::copy 退出。

关于c++ - 无法解释为什么 std::istream_iterator 将 std::ios_base 设置为错误状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2365212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com