2011-01-15 3 views
5

Для приложения на C++, как я могу программным способом принудительно завершать файл (EOF) на stdin?Как заставить eof на stdin?

+0

Как вы называете «force EOF on stdin»? Вы можете закрыть stdin (или cin). Вы можете отключить свою петлю в одностороннем порядке. Вы можете найти конец файла (но это не поможет с подключением терминала или канала). Возможно, вы можете задать проблему с помощью функции 'freopen()'; переназначить стандартный ввод для чтения из/dev/null или NUL :. –

ответ

6

Собственно, вы не можете. Пока вы можете читать данные из stdin, EOF не был достигнут, и на самом деле вы никогда не сможете его достичь. Однако вы можете закрыть сам stdin. Для того, чтобы закрыть его, сделайте следующее:

fclose(stdin); 

После этого, вы не можете прочитать данные из stdin.

8

Если вы используете терминал в Unix-подобной системе, нажмите Ctrl-D. В Windows, Ctrl-Z.

Редактировать: Увидев желание сделать это «программно», я предлагаю попробовать fclose(stdin). Если что-то не так хорошо, более суровой идеей может быть использование std::cin.rdbuf(), чтобы установить поток для ссылки на нечто иное, чем истинный stdin, а затем сделать то, что вы хотите для этого потока. Но это начинает плохо пахнуть, как будто вы боретесь с компьютером, поэтому я хотел бы узнать больше о том, какова настоящая цель.

+0

Но это изнутри приложения C++, так же как и отправка Ctrl-D? – WilliamKF

+0

О, я вижу «программно» сейчас. Может быть, вы можете более подробно описать, что вы пытаетесь сделать? –

+1

Просто напишите 0x1A (код ASCII для Ctrl + Z) в stdin. – Tergiver

1

Для каждого потока, созданного специально для этого, есть небольшая функция.

Это синтаксис что-то вроде:

 stream.setstate(stream.flags) 


Так что в вашем коде, вы можете иметь простое условие, которое вызывает что-то вроде:

 std::cin.setstate(std::cin.eofbit); 


документация для этого является довольно скудной, но есть какая-то на cppreference.com и cplusplus.com.

Смежные вопросы