输入不正确时清理istream

时间:2014-04-12 10:46:54

标签: c++ operators operator-overloading istream

我正在查看istream类,我没有看到一个方法可以完全清除缓冲区并将输入设置为下一个“干净”输入的准备就绪。

我为我的类定义了提取运算符,在我的主程序中,我向用户请求输入,如下所示:

while (true) {
    try {
        cout << "Enter input: ";
        MyClass c;
        cin >> c;
        return c;
    } catch(const MyException& e) {
        cerr << "Error\n";
    }
}

如果我输入意外的错误输入,我会陷入无限循环。

在我的overriden extractin方法中,我控制输入不正确并抛出异常,这一切都没问题。我只想清理istream对象,以防止无限循环。

1 个答案:

答案 0 :(得分:1)

首先,您的类的插入器/扩展器不应该抛出异常。 IOStreams被设计为默认情况下不抛出异常并保持一致我建议您不要从I / O运算符中抛出自定义异常。

正如Dieter所说,你最好在流状态中设置std::ios_base::failbit标志而不是投掷。您可以使用setstate()方法执行此操作。完成后,您可以使用if()语句检查有效的提取。要回答您的问题,一旦确定输入是否无效,就清除流状态,并通过调用ignore()清除缓冲区以获取新输入:丢弃其余字符:

while (std::cout << "Enter input: ")
{  
    X x;
    if (!(std::cin >> x))
    {
        std::cout << "Invalid. Try again.\n";
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        continue; // or break if needed
    }
    // handle good input and break if needed
}