Флаги формата и состояния потоков ввода вывода

Рейтинг: 1Ответов: 2Опубликовано: 04.03.2011

Здравствуйте. Есть следующий код, столкнулся с проблемой зацикливания, требуется повторный ввод данных при условии некорректной предыдущей попытки. Как я понимаю, в результате ввода некорректного значения, состояние потока ввода изменяется, что не позволяет вводить новое значение и приводит к зацикливанию. Не уверен, что все именно так, но в любом случае результата нет, надеюсь на коллективный разум, в чем причина и как исправить, спасибо.

void main()
{
    int a = 0;
    bool check = false;

    do {
        while (1) {
            cout << "Vvedite iskomoe znachenie " << endl;
            cin >> a;
            if (a) {
                check = true;
                break;
            } else {
                cout <<
                    "Ohibka prilogenija(vvedeno nedopustimoe znachenie)"
                    << endl;
                break;
            }
        }
    } while (!check);
}

Ответы

▲ 4Принят

Этот способ точно должен сработать.

#include <iostream>

int main()
{
    int a = 0;
    std::ios::iostate state;
    do {
        std::cout << "Input a number" << std::endl;
        std::cin >> a;
        state = std::cin.rdstate();
        if (state != std::ios::goodbit) {
            std::cout << "Error" << std::endl;
            std::cin.clear(std::ios::goodbit);
            std::cin.ignore(65535, '\n');
        }
    } while (state != std::ios::goodbit);
    std::cout << a;
}
▲ 1

Вложенный цикл while(1) ни к чему.