2015-02-20 2 views
1

Я хотел, чтобы игнорировать все символы в cin промывать cin в этом ответе: How to get rid of bad input one word at a time instead of one line at a time?Не может cin.ignore до EOF?

Но я обнаружил, что программа, казалось, повесьте ожидающий ввода, если я писал:

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

Он propperly продувают cin если я использовали '\n' разделитель:

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

Мой вопрос, почему я не могу просто игнорировать до EOF? Почему я должен предоставить разделитель?

+0

You * жестяная банка * игнорируется до EOF. Вы * * игнорировали до EOF. Вы просто не понимали, что это значит. ;-) – DevSolar

+0

Вы дошли до конца 'cin', либо путем перенаправления из файла или другого конечного источника, либо удара CTRL-D или того, что он на вашей платформе? В противном случае он будет ожидать ввода для игнорирования навсегда. –

+0

Итак, ваше желание - отбросить все символы, которые были введены в настоящее время, а затем начать читать нормально? Это хороший вопрос. –

ответ

4

ignore название функции несколько вводит в заблуждение. Что это на самом деле делает это читать и отказаться от ввода до тех пор, пока не будет найден терминатор. И это блокировка читается.

В вашем случае, независимо от входного потока, который вы используете с cin (по умолчанию это stdin) никогда не доставляет конец-файл состояния, так ignore «s чтение блоков/петли отбрасываний навсегда.

+0

Если трубопровод не задействован - чем конец записи испускает EOF при закрытии. Еще одним исключением является пользовательский ввод в терминале, поддерживающем EOF (Linux: ctrl-D) –

+0

В Windows вы можете пометить EOF на консоли с помощью Ctrl-Z + Enter, а на * nix вы сделаете это с помощью Ctrl-D. Так что это не невозможно вырваться, маловероятно, если вы не знаете этого трюка. –

+0

@ Dieter, Mark: Правильно, я не сказал, что входной поток неспособен доставить EOF, только в его случае это не так. –