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

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

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

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

15

Решение

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

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

6

Другие решения

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

По вопросам рекламы ammmcru@yandex.ru