std :: cin.clear () не может восстановить входной поток в хорошем состоянии - PullRequest
2 голосов
/ 10 февраля 2011

Для проверки ввода / вывода bool я попытался запустить эту короткую программу:

#include <iostream>

int main()
{
 while(true)
 {
  bool f;
  if (std::cin >> f)
   std::cout << f << '\n';
  else
  {
   std::cout << "i/o error\n";
   std::cin.clear();
  }
 }
 return 0;
}

Вот вывод, который я получаю:

g++ -Wall -ansi -pedantic -o boolio boolio.cpp
./boolio
0
0
1
1
2
i/o error
-
i/o error
t
i/o error
i/o error
i/o error
... (infinite loop)

Мне интересно, почему я получаю бесконечный цикл при вводе 't', и как это предотвратить.

Спасибо.

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Добавьте эту строку после очистки cin:

std::cin.ignore();

Таким образом, поток игнорирует все, что осталось в его буфере.

1 голос
/ 18 июня 2012

Попробуйте использовать следующую комбинацию:

cin.ignore(INT_MAX, '\n'); // ignore all characters in the current line

cin.clear(); // restore 'good' flag

Использование только cin.ignore() приведет к удалению только одного символа в буфере.

1 голос
/ 10 февраля 2011

if (std::cin >> f) ожидает либо 0, либо 1. И обрабатывает все остальные значения как ошибку I / 0.Даже если вы введете '-' или 2, std::cin.ignore() все равно потребуется.

Если вы хотите, чтобы программа вводила только значения true или false , используйте следующий оператор вместо (std::cin >> f)

(std::cin >> boolalpha >> f)

...