Istream失败了。使用它的安全方法是什么!

时间:2011-03-30 03:29:10

标签: c++ iostream

所以我想知道如果我有以下代码会发生什么

int i;
cin>> i;

但实际上我输入了"abc"而不是整数。它失败?有哪些方法可以确保从命令行读取不会失败?

2 个答案:

答案 0 :(得分:2)

将设置流的失败位,并且在该位清零之前,进一步的操作将不执行任何操作。您可以阅读有关流位here的更多信息。

如果您不希望它失败,只需检查位:

int i;
std::cin >> i;

if (!std::cin)
{
    // didn't read correctly, handle it
}

或者一举一动:

int i;

if (!(std::cin >> i))
{
    // didn't read correctly, handle it
}

可能有更强大的收集输入方式,但您想要的取决于您的情况。

答案 1 :(得分:1)

几乎按定义,您无法确保从命令中读取 线不会失败。要做到这一点,你必须控制正在发生的事情 键入键盘(或在文件中或输入的任何内容) 重定向自)。您必须为该输入中的错误做好准备。如果 你需要一个int,并且用户输入“abc”,你需要输入 失败,以便您可以检测错误并恢复。

在输入流中,一旦检测到错误,您必须重置 它(std::cin.clear()),然后以某种方式重新同步:“abc”是 仍然在流中,并将成为您阅读的下一件事 - 取决于 应用程序,istream::ignore可以使用,但一个常用的习惯用法 用于处理控制台输入是逐行读取,然后解析该行 使用std :: istringstream,boost :: regex或任何其他的组合 你恰好有用的工具。如果该行应该只包含 一个int,这是矫枉过正:std::cin.ignore( INT_MAX, '\n' ) 应该很好地做到这一点,但对于具有多个字段的行,该行 按行方法可能更可取;它也有优势 区分由于语法错误导致的文件结束而导致的失败 自动。 (getline std::cin的失败是文件的结尾; 读取istringstream时失败通常是语法错误。)