gpt4 book ai didi

c++ - 输入不正确时清除 istream

转载 作者:行者123 更新时间:2023-11-28 06:57:02 26 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

首先,您的类的插入器/提取器不应抛出异常。 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
}

关于c++ - 输入不正确时清除 istream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23029356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com