Страницы

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

четверг, 29 ноября 2018 г.

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

Учу С++. Хочу разобраться, как работает ввод-вывод в консоли. Уже понял, что если вводишь в 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; } }


Ответ

Это особенности работы 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
>

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

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