Как правильно обрабатывать ios :: failbit

#c #exception #stdin

#c #исключение #stdin

Вопрос:

Я попытался создать программу, которая принимает входные данные до тех пор, пока не будет введено значение -1, и правильно обрабатывает входные данные, используя исключения.

Он принимает вводимые пользователем данные FirstName Age и выводит FirstName и увеличивает возраст на 1. Если вторая переменная не является целым числом (возраст), то она должна печатать FristName и 0 .

Но моя программа выдает неожиданный результат. Как я могу это исправить?

Заранее спасибо.

Формат ввода

 John 12

Michel 15

Alice Graz 11

Bob 15

-1
 

Ожидаемый результат

 John 13

Michel 16

Alice 0

Bob 16
 

Мой код

 #include <string>
#include <stdexcept>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
    string inputName;
    int age;

    cin.exceptions(ios::failbit);

    cin >> inputName;
    while (inputName != "-1")
    {
        try
        {
            cin >> age;
        }
        catch (exception ex)
        {
            age = -1;
            if (cin.fail())
                cin.clear();
            cin.ignore();
        }

        cout << inputName << " " << (age   1) << endl;

        cin >> inputName;
    }

    return 0;
}
 

Ответ №1:

попробуйте использовать cin.ignore() так

 cin.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
 

Вы должны включить <limits> файл заголовка.

Комментарии:

1. Спасибо, что работает. но есть предупреждение предупреждение: перехват полиморфного типа ‘class std::exception’ по значению [-Wcatch-value=] catch (исключение ex)

2. можете ли вы просто объяснить, что делает эта строка и почему она передает такой числовой предел вместе с ‘n’. Спасибо

3. вместо этого попробуйте этот оператор catch catch(std::ios_base::failureamp; faill)

4. вы можете сослаться на это cplusplus.com/reference/istream/istream/ignore

5. Большое вам спасибо.