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

Correct way to use cin.fail()

本文关键字:方法 cin fail 使用      更新时间:2023-10-16

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

我正在制作一个程序,你需要在其中输入一些东西。是否需要输入数字或字符还不太清楚。当用户输入一个字符而不是数字时,控制台就会变得疯狂。如何使用cin.fail()解决此问题?

或者有更好的方法吗?

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.
    }
}
如果最后一个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个值之后继续,因为它在读取第7个后退出,因为这不是整数:cin.fail()返回true