Почему ввод только иногда заканчивается, когда я нажимаю Ctrl + Z в консольной программе Windows?

Я понимаю, что использовать ctrl-z для сигнала EOF или EOT, как правило, устарел и не рекомендуется, но мне просто интересно, что происходит под капотом.

Скажем, у меня есть что-то подобное в C ++:

#include  #include  int main() { while (!cin.eof()) { string str; getline(cin, str); } cout << "out of while" << endl; return 0; } 

Если я выполняю abc [^ Z] [новая строка], программа все еще работает. То же самое для abc [^ D] [новая строка].

Но если я ввожу строку, содержащую только [^ Z] [новую строку], программа существует правильно.

Я понимаю, что, скорее всего, это ОС, но мне просто интересно, что там происходит.

Во-первых, эта статья имеет отличное представление о Ctrl-Z (DOS / Windows) и Ctrl-D (UNIX / Linux): http://latedev.wordpress.com/2012/12/04/all-about-eof/

Это стоит прочитать. Он также указывает на проблему с вашим while-loop выше.

Самое главное, что Ctrl-Z не указывает EOF. Однако, когда это первый символ в строке, большинство программ Windows, читающих с консоли, распознают это как конец ввода. Результат – это EOF на cin . Действительно, файлы, открытые в текстовом режиме, могут вести себя одинаково, хотя ничто в стандарте C ++ их не требует.

Обратите внимание, что исторически Ctrl-Z для конца ввода должно быть в начале строки. Ctrl-Z в другом месте на линии не имеет такого же эффекта.