Правильный способ использования cin.неудача()

Как правильно использовать cin.fail();?

Я делаю программу, где вам нужно что-то ввести. Это не очень ясно, если вам нужно ввести число или символ. Когда пользователь вводит символ вместо числа консоль сходит с ума. Как я могу использовать cin.fail() исправить?

или есть способ лучше?

2 ответов


cin.fail() возвращает true, если последняя команда cin не удалась, и false в противном случае.

пример

int main() {

int i, j = 0;

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

теперь предположим, что у вас есть текстовый файл - ввода.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.


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.
    }
}