Копирование из istream никогда не останавливается

Этот фрагмент кода работает бесконечно:

copy(istream_iterator<char>(cin), istream_iterator<char>(), back_inserter(buff));

Я ожидал, что он остановится, когда я нажму Enter.
Однако это не так.
buff — это вектор символов.


person the_drow    schedule 09.05.2010    source источник


Ответы (1)


Я предполагаю, что вы печатаете что-то на клавиатуре.

Клавиша ввода не означает конец потока. Это просто еще один персонаж с точки зрения кино. Для этого необходимо отправить EOF (Ctrl+Z, Enter в Windows и Ctrl+ D в Unix/Mac).

Кстати, это не обычный способ чтения символов из консоли. Это очень неэффективно (istream_iterator вызывает operator>> для каждого символа) и будет работать неправильно с пробелами. Чтобы прочитать строку ввода данных, используйте вместо этого getline.

person Marcelo Cantos    schedule 09.05.2010
comment
Итак, в основном вы говорите, что я неправильно кодирую? - person the_drow; 09.05.2010
comment
Да; Я изменил вопрос, чтобы отразить то, что, по моему мнению, вы пытаетесь достичь. - person Marcelo Cantos; 09.05.2010
comment
Я пробовал getline, но он не работает с вектором. Это работает, когда я cin ›› tempstring; а затем скопируйте его в вектор, но, на мой взгляд, это очень неэффективно. - person the_drow; 09.05.2010
comment
Вы должны использовать его с std::string, а не с вектором. Копирование в вектор выполняется по крайней мере в десять миллионов раз быстрее, чем скорость набора текста, поэтому эффективность вряд ли является проблемой. В любом случае, вы должны иметь возможность делать со строкой почти все, что вы можете делать с вектором. - person Marcelo Cantos; 09.05.2010
comment
Кстати, cin >> tempstring не читает строки, он читает до следующего пробела. - person Marcelo Cantos; 09.05.2010
comment
Для повышения производительности также можно использовать istreambuf_iterator<char>(cin). Это быстрее, так как он не будет форматировать и все такое. - person Johannes Schaub - litb; 09.05.2010
comment
@Johannes Schaub - litb: Не могли бы вы продемонстрировать, как будет выглядеть такой код? - person the_drow; 09.05.2010
comment
@the_drow точно такой же, как ваш код, только с измененными именами итераторов :) - person Johannes Schaub - litb; 09.05.2010