Межстрочный интервал после 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
для того, чтобы создать новую линию пространства.
Спасибо!
3 ответа
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" операционной системе. Это внутрипрограммное хранение и объединение данных называется буферизацией, а процесс записи данных из буфера в операционную систему называется сбросом.
По умолчанию cin
заканчивается чтение потока, когда он получает newline
который также добавляет новую строку.
Когда вы используете cin
(std::cin
) с терминалом, вам часто приходится нажимать ввод, чтобы сказать терминалу "эй, мой ввод завершен".
Ввод также переводится как перевод строки, поэтому он придерживается того, что по сути std::endl
потому что ты нажал Enter
,
Во многих случаях вы можете использовать символ возврата \b
отозвать текущую запись консоли. Это может помочь вам попробовать std::cout << '\b'
: это случилось с возвратом в моем терминале (Windows).