正确使用cin.fail()的方法

时间:2013-07-29 16:09:25

标签: c++ cin

使用cin.fail();的正确方法是什么?

我正在制作一个你需要输入内容的程序。您是否需要输入数字或字符并不十分清楚。当用户输入一个字符而不是一个数字时,控制台会发疯。如何使用cin.fail()来解决此问题?

或者有更好的方法吗?

2 个答案:

答案 0 :(得分:17)

std::cin.fail()用于测试前面的输入 成功了。然而,使用它更加惯用 流,好像它是一个布尔值:

if ( std::cin ) {
    //  last input succeeded, i.e. !std::cin.fail()
}

if ( !std::cin ) {
    //  last input failed, i.e. std::cin.fail()
}

在输入语法允许数字的上下文中 一个字符,通常的解决方案是通过行(或在线)读取它 一些其他字符串形式),并解析它;当你发现它 有一个号码,您可以使用std::istringstream来 转换它,或任何其他替代品(strtol,或 std::stoi如果你有C ++ 11)。

然而,可以直接从中提取数据 流:

bool isNumeric;
std::string stringValue;
double numericValue;
if ( std::cin >> numericValue ) {
    isNumeric = true;
} else {
    isNumeric = false;
    std::cin.clear();
    if ( !(std::cin >> stringValue) ) {
        //  Shouldn't get here.
    }
}

答案 1 :(得分:8)

如果最后一个cin命令失败,则

cin.fail()返回true,否则返回false。

一个例子:

int main() {
  int i, j = 0;

  while (1) {
    i++;
    cin >> j;
    if (cin.fail()) return 0;
    cout << "Integer " << i << ": " << j << endl;  
  }
}

现在假设你有一个文本文件--input.txt,它的内容是:

  30 40 50 60 70 -100 Fred 99 88 77 66

如果您将在上面执行短程序,则会产生如下结果:

  Integer 1: 30
  Integer 2: 40
  Integer 3: 50
  Integer 4: 60
  Integer 5: 70
  Integer 6: -100

在读取第七个后退出后不会继续显示第6个值,因为这不是整数:cin.fail()会返回true