Если вы подключите istream_iterator
к потоку, то istream_iterator
будет действительным до тех пор, пока для потока, из которого он читает, не будет установлен failbit
или badbit
. Это происходит только в том случае, если вы читаете искаженные данные из потока или в потоке данных заканчиваются.
Поскольку cin
считывает данные из стандартного потока ввода (который по умолчанию в большинстве систем подключен к клавиатуре), istream_iterator
всегда может считывать больше данных. То есть, после того, как вы ввели список чисел, cin
не будет в состоянии ошибки, потому что вы всегда можете ввести больше чисел в программу. Тот факт, что программа «зависает», вызван тем, что она ожидает ввода большего количества данных. Вы можете проверить это, введя дополнительные данные после того, как программа обработает все введенные вами данные.
Чтобы cin
прекратил чтение данных, у вас есть несколько вариантов. Во-первых, вы можете сделать так, чтобы ОС перенаправляла cin
, передавая данные в программу или считывая данные из файла. Например, в системе Linux вы можете запустить свою программу следующим образом:
./my-program < my-input-file
Как только программа прочитает весь текст из my-input-file
, cin
встретит конец файла и вызовет failbit
. Затем цикл завершается.
Кроме того, вы можете явно указать, что cin
достигнет конца файла. В системах Linux, если вы запускаете программирование из командной строки, вы можете нажать CTRL + D, чтобы заставить стандартный ввод отправить сигнал конца файла, что также приведет к выходу из цикла. В качестве альтернативы вы можете ввести недопустимое значение с плавающей точкой в cin
, например строку STOP!
. Это приведет к тому, что failbit
сработает на cin
, поскольку он не может обрабатывать значение как число с плавающей запятой, а затем приведет к выходу из цикла.
Надеюсь, это поможет!