cin.clear () не сбрасывает объект cin - PullRequest
9 голосов
/ 14 сентября 2011

У меня есть следующий цикл. Следует читать цифры до EndOfFile или до ввода пользователем -999

int arr[100];

int index;

for (index = 0; index < 100; index++)
{
 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  index--;
  continue;
 }
 if (arr[index] == -999)
 {
     break;
 }
}

Когда пользователь вводит недопустимую вещь, такую ​​как некоторые char с, этот цикл повторяется навсегда без clear состояния ошибки или остановки.

1 Ответ

9 голосов
/ 14 сентября 2011

После вызова clear вы также должны каким-то образом удалить неправильный ввод из потока. Вот один из способов:

 cin >> arr[index];
 if (!cin)
 {
  cin.clear();
  std::string ignoreLine; //read the invalid input into it
  std::getline(cin, ignoreLine); //read the line till next space
  index--;
  continue;
 }

Это потому, что когда cin не может прочитать неверный ввод, он остается там в потоке. Это должно быть удалено, каким-то образом. Я просто читаю и игнорирую это.

Вы также можете использовать ignore как:

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

, что, на мой взгляд, лучше, если входные данные разделены пробелом (и если вы не хотите проверять неверный ввод). онлайн-документ говорит:

IStream :: игнорировать

istream & ignore (размер потока n = 1, int delim = EOF); ​​

Извлечение и удаление символов

Извлекает символы из последовательности ввода и удаляет их.

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

...