Поведение std :: cin при использовании в состоянии цикла while C ++ - PullRequest
2 голосов
/ 07 декабря 2011

Вот небольшая придуманная программа, которая выводит на экран целое число, только что набранное.

#include <iostream>
int main(int argc, char *argv[])
{
  int n;
  while(std::cin>>n)
    {
      std::cout<<"You typed "<<n<<std::endl;
    } 

  return 0;
}

Теперь, когда я ввожу целые числа, программа работает нормально. Однако, если я введу числа с плавающей запятой, например, 10,8, программа отобразит на экране 10 (как и должно быть, поскольку она преобразует число с плавающей запятой в целое число), а затем программа завершает работу . Почему это происходит? Ниже приведен пример вывода терминала.

Desktop: ./a.out
4
You typed 4
-9
You typed -9
10.8
You typed 10
Desktop: 

Ответы [ 2 ]

5 голосов
/ 07 декабря 2011

После строки «Вы ввели 10» символы «.8» остаются в потоке. Когда он пытается прочитать это в целое число, он терпит неудачу, и поэтому он переводит поток в плохое состояние.

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

(В частности, он устанавливает "плохой" бит, я думаю, но прошло слишком много времени с тех пор, как я с этим справился, и я не уверен - проверьте документацию, если вам нужен такой уровень детализации)

В сторону: знайте, что если вы попытаетесь прочитать снова, символы ".8" ​​ все равно останутся в потоке, и вы снова потерпите неудачу . Это распространенная ошибка ввода / вывода.

5 голосов
/ 07 декабря 2011

Не должно быть никакого приведения.

10.8 читается как 10, а затем . вызывает ошибку, интерпретируя текст как целое число, в результате чего failbitзадавать.Это, в свою очередь, приведет к выходу из вашего цикла.

Если вы хотите обработать 10.8, прочитайте double и выполните кастинг самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...