我正在查看istream
类,我没有看到一个方法可以完全清除缓冲区并将输入设置为下一个“干净”输入的准备就绪。
我为我的类定义了提取运算符,在我的主程序中,我向用户请求输入,如下所示:
while (true) {
try {
cout << "Enter input: ";
MyClass c;
cin >> c;
return c;
} catch(const MyException& e) {
cerr << "Error\n";
}
}
如果我输入意外的错误输入,我会陷入无限循环。
在我的overriden extractin方法中,我控制输入不正确并抛出异常,这一切都没问题。我只想清理istream
对象,以防止无限循环。
答案 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
}