Я заметил это в следующем коде:
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";
Выходные данные в командном окне для C ++ автоматически помещают «Это через интервал» в следующую строку. Это пространство что бы ни было после cin
линии без необходимости использования потокового манипулятора (почему это называется потоковым манипулятором?) endl
, Принимая во внимание, что если у меня есть только код:
cout << "Please enter your number: ";
cout << "Is this spaced";
Это не будет автоматически пробел строки с «Это через интервал». Вместо этого обе линии соединены. Мне интересно узнать, почему это так, потому что я всегда думал, что вам нужно endl
для того, чтобы создать новую линию пространства.
Спасибо!
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
) с терминалом, вам часто приходится нажимать ввод, чтобы сказать терминалу «эй, мой ввод сделан».
Enter также переводится как новая строка, поэтому он придерживается того, что по сути std::endl
потому что ты нажал Enter
,
Во многих случаях вы можете использовать символ возврата \b
отозвать текущую запись консоли. Это может помочь вам попробовать std::cout << '\b'
: это случилось с возвратом в моем терминале (Windows).