Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

Сочетания клавиш в консоли, ввод-вывод

#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 >

Комментариев нет:

Отправить комментарий