为什么std :: cin.clear()在此简单程序中不起作用?

时间:2019-02-11 23:00:43

标签: c++ iostream

我正在解决一些打发时间的练习,遇到一种我不了解的行为,我将解释:

练习:

  

编写一个程序,该程序读取并存储一系列整数,然后计算前N个整数的和。首先,要求输入N,然后将值读入向量,然后计算前N个值的总和。

由于我要求输入N作为第二步:

在第二个std::cinstd::cin >> values_to_compute)中,必须保留while语句以继续执行程序,“只有在所读取的内容不是双精度的情况下才可能。例如,我可以输入; “ k”或“你好吗?”或Ctrl + Z(我在Windows 10上)。

int main() {
    try {
        double holder {0};
        std::vector<double> values;
        while (std::cin >> holder) {
            values.push_back(holder);
        }
        std::cin.clear();
        std::cout << "Out of the loop, now entering to the other std::cin\n";
        int values_to_compute {0};
        std::cin >> values_to_compute;
        std::cout << "Computing...\n";
        double result_computed {0};
        for (int i {0}; i < values_to_compute; ++i) {
            result_computed += values[i];
        }
        std::cout << "Result computed " << result_computed << '\n';

        system("pause");
        return 0;
    }
    catch (std::runtime_error& e) {
        std::cerr << e.what() << '\n';

        system("pause");
        return 1;
    }
}

好吗? 因此,std::cin使一会儿处于不良好的状态。我必须打电话给std::cin.clear()才能再次使用std::cin

好吗? 好吧,如果我键入 Ctrl + Z 退出while循环,那么std::cin.clear()就可以了;如果我键入的不是 Ctrl + Z ,则std::cin.clear()不起作用。

我想知道为什么这种行为。

1 个答案:

答案 0 :(得分:2)

这是因为std::cin::clear清除了cin的错误状态,但是不会从流中删除数据。在阅读std::cin::ignore()之前,您可以使用values_to_compute阅读和丢弃一行文本。

std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

确保#include <limits>才能获得std::numeric_limits