Пример копирования istream_iterator продолжает ждать ввода - PullRequest
0 голосов
/ 10 мая 2018

Я попытался реализовать пример потоковых итераторов со страницы 107 «Стандартной библиотеки C ++». Я застрял в этой строке:

copy (istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(coll)); 

Программа продолжает чтение данных с консоли, но не переходит на следующую строку. Как мне пройти дальше этого пункта?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018
Например,

, если бы вы сделали входной поток int, то вы бы дали ввод, например - 45 56 45345 555 ....., так что во всех этих случаях операция чтения входного потока вернулась бы истинное значение - while (cin>>var) { } оператор while не остановится, если получит допустимый ввод, поэтому чтобы остановить чтение символов, мы дали ему следующий ввод, ... 54 56 3545 | и как только он получает специальный символ, цикл while останавливается, когда условия возвращают false.

То же самое относится и ко всем другим типам входных потоков.

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

Решением этой проблемы является использование "ctrl + D в UNIX" и "ctrl + Z в windows", поскольку оно дает значение NULL в состоянии цикла while, что означает ложь, следовательно, останавливает чтение ввода строки.

0 голосов
/ 10 мая 2018

Из cppreference:

Конструкция по умолчанию std::istream_iterator известна как конец потока итератор. Когда действительный std::istream_iterator достигает конец основного потока, он становится равным end-of-stream итератор. Разыменование или инкремент к нему вызывает далее undefined поведение

жирный шрифт добавлен

Другими словами, std::istream_iterator<string>(std::cin) продолжает работать до конца ввода для std::cin. Это не происходит в конце строки, но в конце файла . В консоли есть специальные команды для запуска EOF :

В системах UNIX это Ctrl + D , в Windows Ctrl + Z .

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