返回 istream&对象以检查条件

Returning istream& object to check if condition

本文关键字:检查 条件 对象 istream 返回      更新时间:2023-10-16

我现在读的书建议在read()函数中返回istream&,以便能够写出这样的东西

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;
}

std::iostream对象如std::cin可以在bool上下文中使用来报告是否处于错误状态

你的while循环在in进入错误状态时结束,比如你试图读取一个随机单词作为double

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

当跳出以下循环时,从函数返回:

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

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

您将需要一种不同的方法来测试read是否成功。例如

  1. 如果r有一个或多个值,则认为read成功。
  2. 如果r的值大于等于10,则认为read成功。