Очистить cin в С++

Возможный дубликат:
Почему это чтение cin застряло?

Я перегрузил оператор istream (istream &operator>>...), и он принимает точку в формате:

(<x-coordinate>,<y-coordinate>)

Я хочу проверить это несколько (10) раз, поэтому написал:

for (int i = 0; i < 10; i++)  {
    cin >> a;
    if (!cin.fail()) { cout << a << endl; }
    else { cout << "Invalid input!" << endl; cin.clear(); }
}

РЕДАКТИРОВАТЬ:

Теперь у меня есть следующий код:

for (int i = 0; i < 10; i++)  {
    cin >> a;
    if (!cin.fail()) { cout << a << endl; }
    else {
        cout << "Invalid input!" << endl; cin.clear();
        while (!cin.eof()) { cin.ignore(); } cin.ignore();
    }
}

Игнор предложил Ктулху. Однако проблема в том, что cin по-прежнему выводит «Неверный ввод!» после выполнения кода выше:

(3,3) <-- input
(3,3) <-- output
Invalid output! <-- second output

Есть ли способ, которым я могу очистить то, что находится в cin?


person Supervisor    schedule 28.10.2012    source источник
comment
cin.clear() очищает флаги, а не содержимое. Вы хотите ignore.   -  person chris    schedule 28.10.2012
comment
К сожалению, термин «замятый» — это не тот термин, который я бы искал и tl;dr. :)   -  person Supervisor    schedule 28.10.2012
comment
tl;dr не является хорошим ответом на полезный ответ.   -  person nothrow    schedule 28.10.2012
comment
@Supervisor: Если предыдущий материал по теме слишком длинный, чтобы вы могли его прочитать, то ваш вопрос слишком длинный, чтобы я мог ответить на него.   -  person Lightness Races in Orbit    schedule 28.10.2012
comment
Прости Бен. Никакого неуважения. :'(   -  person Supervisor    schedule 28.10.2012


Ответы (1)


cin.clear() не очищает буфер, а сбрасывает флаги ошибок в потоке. Затем вам нужно вызвать cin.ignore

istream&  ignore ( streamsize n = 1, int delim = EOF );

Извлекает символы из входной последовательности и отбрасывает их.

Извлечение заканчивается, когда n символов были извлечены и отброшены, или когда найден символ-разделитель, в зависимости от того, что наступит раньше. В последнем случае также извлекается сам символ-разделитель.


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

Числовые пределы

person Anirudh Ramanathan    schedule 28.10.2012
comment
Я заменил cin.clear() на cin.ignore() и получил те же результаты. - person Supervisor; 28.10.2012
comment
Вам нужны оба. Также вызовите cin.clear с правильными аргументами. Количество очищаемых символов буфера и разделитель, на котором очистка останавливается. - person Anirudh Ramanathan; 28.10.2012
comment
Даже с: cin.clear(); cin.ignore(std::numeric_limits‹std::streamsize›::max(), '\n'); У него все еще есть один вывод Invalid input! Я просто использую логическое значение, чтобы отслеживать, вошло ли оно в оператор else, и пропущу \n вручную. Спасибо за помощь. - person Supervisor; 28.10.2012
comment
Вывод остался прежним? - person Anirudh Ramanathan; 28.10.2012
comment
Это: (3,3) (3,3) Неверный ввод! - person Supervisor; 28.10.2012