回归istream&对象检查是否有条件

时间:2015-07-20 00:41:50

标签: c++

我正在阅读的这本书建议在istream&函数中返回read(),以便能够写出类似这样的内容

if (read(cin, some_container)) {...}

然而,当我尝试这段代码时,无论如何,我的函数总是返回false。问题在哪里?

#include <iostream>
#include <vector>

using namespace std;

istream& read(istream& in, vector<double>& s)
{
    if (in)
    {
        in.clear();

    double c;
    while (in >> c)
        s.push_back(c);
    }

    return in;
}

int main()
{
    vector<double> r;
    if (read(cin, r))
        cout << "success" << endl;
    else
        cout << "false returned" << endl;
    return 0;
}

2 个答案:

答案 0 :(得分:0)

当你突破以下循环时从函数返回:

while (in >> c)
    s.push_back(c);
}

in处于if (in)为假的状态时,该循环会中断。

您需要采用不同的方式来测试read是否成功。例如

  1. 如果r有一个或多个值,请考虑read成功。
  2. 如果r有10个或更多值,请考虑read成功。

答案 1 :(得分:0)

std::iostreamstd::cin can be used in a bool context对象报告是否处于错误状态

while循环在in进入错误状态后结束,例如,如果您尝试将随机字作为double读取。

循环之后,返回相同的in对象,在if上下文中使用,并再次评估为false,因为它退出循环后状态没有改变