@oblepyx

Почему Ctrl + D не дает коду выполняться дальше, а просто завершает программу?

Привет.

В Linux при вводе строки сочетание клавиш Ctrl + D должно вызывать EOF, то есть конец ввода.

У меня есть программа, которая должна считывать ввод строки, затем возвращать ее значение в консоль и это всё в цикле, который завершается при условии конца ввода. А после цикла программа должна выводить количество напечатанных символов. Но при нажатии Ctrl + D при окончании ввода программа просто останавливается и не идет дальше.

Вот кусок кода:
char ch;
int count = 0;
std::cin.get(ch);
while (!std::cin.eof()) {
    std::cout << ch;
    count++;
    std::cin.get(ch);
}
std::cout << '\n' << count << " characters read\n";


Вот как это выглядит в консоли:
some text here
some text here
eof
eof
^D

Процесс завершился c кодом выхода 0


То есть последняя строка кода просто не выполняется.

Как решить это?
  • Вопрос задан
  • 210 просмотров
Решения вопроса 1
@oblepyx Автор вопроса
Я нашел решение проблемы. Если у вас тоже при сочетании клавиш Ctrl + D закрывается консоль с программой, вот то, что помогло лично мне:

Нужно найти настройки запуска программ в своей IDE и настроить конфигурацию запуска через внешнюю консоль. Вот откуда я взял это: https://stackoverflow.com/a/78456495
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Adler_lug
@Adler_lug
Потому что Ctrl+D ≠ EOF
Saying that Ctrl-D sends EOF is an educational lie-to-children. What it actually does is make any ongoing read() from the terminal return immediately with the contents of the current line buffer if any.

Synergy happens because the Unix convention is that a read() of zero bytes represents EOF.

This means that if you press Ctrl-D with an empty buffer, the read() will return with zero bytes, and a canonical program will interpret it as end-of-file. This is obviously just an illusion since you're still there to input more on the terminal, and a less canonical program could just keep reading if it wanted to.

If you instead press Ctrl-D after entering some data, then that data is just returned and a canonical program will keep reading to find a linefeed or whatever else it's looking for.

This is why EOF behavior is only triggered in canonical programs when Ctrl-D is pressed either after another Ctrl-D (the first flushes the buffer, the second returns a now-empty buffer) or after an Enter (for the same reason).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы