Учу С++. Хочу разобраться, как работает ввод-вывод в консоли.
Уже понял, что если вводишь в 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
Если что-то было введено до ^Z, то он интерпретируется как \x1a (символ замены), и всё что введено в этой строке далее - игнорируется:
> test.exe
1^Z23
4
31 1a 34
При этом по умолчанию std::istream не считает \1a разделителем слов.
Если до ^Z ничего не вводить, то поток закрывается, а последующие символы в строке игнорируются:
> test.exe
123
31 32 33 ^Z456
>
Комментариев нет:
Отправить комментарий