Межстрочный интервал после endl и cout?

Я заметил это в следующем коде:

    cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";

Выходные данные в командном окне для C ++ автоматически помещают «Это через интервал» в следующую строку. Это пространство что бы ни было после cin линии без необходимости использования потокового манипулятора (почему это называется потоковым манипулятором?) endl, Принимая во внимание, что если у меня есть только код:

    cout << "Please enter your number: ";
cout << "Is this spaced";

Это не будет автоматически пробел строки с «Это через интервал». Вместо этого обе линии соединены. Мне интересно узнать, почему это так, потому что я всегда думал, что вам нужно endl для того, чтобы создать новую линию пространства.

Спасибо!

1

Решение

cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";

Это больше, чем кажется на первый взгляд. std::cout а также std::cin по умолчанию — связанный потоки. Это означает, что std::cout автоматически сбрасывается (то есть любой ожидающий вывод сбрасывается из любых буферов вашей программы в операционную систему) всякий раз, когда std::cin запрашивается для ввода. Вот почему вы можете быть уверены, что увидите "Please enter your number: " прежде чем программа остановится, чтобы ждать, пока вы наберете. Конечно, в большинстве операционных систем вы можете начать печатать перед ожиданием программы — она ​​выведет его на терминал и запомнит, чтобы предоставить std::cin позже: это также происходит, когда вы вызываете программу с конвейером, таким как:

echo "123" | the_program

Вход доступен, когда the_program начинает работать, но сидит там cin >> Number; попытаться разобрать. В этом случае, однако, нет ввода с клавиатуры, чтобы программа терминала выводила эхо, и, следовательно, последовательность «123 \ n» не отображается на экране между вашими двумя строками вывода — без этой новой строки «\ n» ваш вывод будет все появляются в одной строке.

Если вы хотите читать с клавиатуры без ввода с клавиатуры, перемещая курсор на следующую строку, лучше всего использовать ncurses или какую-либо подобную библиотеку. Библиотеки могут использовать escape-последовательности, подходящие для вашего терминала (если они есть), для изменения положения курсора. Это может быть практично для написания кода самостоятельно, если у вас есть очень ограниченный диапазон поддерживаемых терминалов (например, только xterm-совместимые, VT220 или командные оболочки Windows). Также обычно возможно подавить печать ввода с клавиатуры, но тогда пользователь не мог видеть, как он сам вводит цифры. Другой вариант — установить терминал в режим ввода, поддерживающий посимвольное чтение ввода (некоторые терминалы по умолчанию работают построчно, поэтому вы не можете видеть символы до тех пор, пока не будет нажата клавиша возврата) — комбинируя это с подавленным эхом над вашим Программа может печатать цифры по мере их ввода, но не печатать перевод строки.

Отдельно, хорошей практикой является завершение вывода вашей программы новой строкой, так как в некоторых средах вызова в противном случае последняя строка не будет отображаться. И это довольно спорное, но ИМХО лучшая практика не использовать std::endl когда вам не нужно сбрасывать вывод — просто используйте \n и пусть библиотека C ++ iostream буферизует несколько строк и записывает их фрагментами эффективного размера в операционную систему.

Объяснение смыва

Скажем, у вас есть такая программа:

std::string h = "hello ";
std::string w = "world";

std::cout << h;
std::cout << w << '\n';

На каком-то этапе программе необходимо сообщить операционной системе (Linux, Windows и т. Д.) О тексте, который должен быть напечатан, разрешив ей отправить его в приглашение shell / cmd (которое может отправить его на экран и поместить в буферы). для полос прокрутки и т. д.), файл или что-то еще. По большому счету, программа медленно говорит операционной системе делать такие вещи, поэтому программа в целом будет работать быстрее, если она запомнит «привет», добавит «мир» и \n (перевод строки), затем отправляет «hello world \ n» операционной системе одновременно. Это внутрипрограммное хранение и объединение данных называется буферизацией, а процесс записи данных из буфера в операционную систему называется сбросом.

5

Другие решения

По умолчанию cin заканчивается чтение потока, когда он получает newline который также добавляет новую строку.

1

Когда вы используете cin (std::cin) с терминалом, вам часто приходится нажимать ввод, чтобы сказать терминалу «эй, мой ввод сделан».

Enter также переводится как новая строка, поэтому он придерживается того, что по сути std::endl потому что ты нажал Enter,

Во многих случаях вы можете использовать символ возврата \b отозвать текущую запись консоли. Это может помочь вам попробовать std::cout << '\b': это случилось с возвратом в моем терминале (Windows).

0
По вопросам рекламы [email protected]