#cpp #windows #input #io #hotkeys
Учу С++. Хочу разобраться, как работает ввод-вывод в консоли. Уже понял, что если вводишь в cin слова через пробел/табуляцию, он считывает их через этот данный разделитель и выводит в cout. К примеру, ввожу "hello man", - выводит "helloman". Это нормально, все ясно. Также я узнал, что CTRL+Z останавливает процесс и означает символ конца файлы при считывании. Нажимаю ctrl+Z (перед этим не ввожу символы) и процесс завершается. Вопрос 1: почему, если я ввожу, к примеру "hello ^Z" (^Z я именно ввел сочетанием клавиш, а не вручную сначала ^, потом Z), то сначала в потоке вывода появляется hello, а за ним ничего не появляется, только если нажму enter, выводится вопросительный знак в квадратике! (что это вообще такое?) Вопрос 2: Если потом cin считывает символы через разделители, почему тогда он не считал сначала hello, потом ^Z и в соответствии с командой не завершил процесс, считав символ конца файла, как его называют в книге Страуструп. Объясните, пожалуйста. int main() { string current; while(cin>>current){ cout << current; } }
Ответы
Ответ 1
Это особенности работы cmd.exe. cmd.exe отправляет текст в поток ввода построчно, и Ctrl+Z закрывает поток ввода только если до него не были введены другие символы. В этом можно убедиться переписав программу следующим образом: #include#include int main() { std::string s; while (std::cin >> s) for (int b : s) std::cout << std::hex << b << ' '; } Если что-то было введено до ^Z, то он интерпретируется как \x1a (символ замены), и всё что введено в этой строке далее - игнорируется: > test.exe 1^Z23 4 31 1a 34 При этом по умолчанию std::istream не считает \1a разделителем слов. Если до ^Z ничего не вводить, то поток закрывается, а последующие символы в строке игнорируются: > test.exe 123 31 32 33 ^Z456 >
Комментариев нет:
Отправить комментарий