У меня есть сомнения по поводу endl
функции обработчика потока.
Согласно книге, которую я читаю (Deitel), он очищает endl
буфер вывода.
Что это значит? Так как если ставлю "\n"
или std::endl
в конце cout
получаю тот же вывод.
Есть ли способ увидеть разницу?
endl
используется для создания разрыва строки:результат будет:
обратите внимание, что для
hola3
yhola4
не использовалсяendl
endl
имеет тот же результат, что и \n, с той лишь разницей, что онstd::endl
очищает буфер вывода, а '\n' - нет, т.е. если вы хотите принудительно вывести вывод. используетendl
тот же пример, но с
\n
:То, что они говорят в тексте, который вы прочитали, верно, и вы также можете прочитать это в любой документации
std::endl
:На испанском:
Имейте в виду, что операционная система реализует поток данных, который выводится на пользовательский терминал, иначе, чем вывод потока данных в файл, канала в другое приложение и т. д.
Таким образом, в обычном приложении с прямым выводом на терминал вы не сможете отличить сброс буфера потока данных от его сброса.
Чтобы показать вам разницу, я собираюсь использовать следующий код:
Выполняя код в обычном режиме (
./pruebas
), мы отправляем стандартный вывод на пользовательский терминал. Не будет никакой разницы между использованиемstd::endl
или не использованием, потому что операционная система автоматически сбрасывает временную память ( буфер ), как только встречается возврат каретки(\n
) .При выполнении приложения путем отправки его вывода в конвейер во второе приложение (
./pruebas | more
) операционная система не будет автоматически очищать буфер при встрече с символом возврата каретки , поэтому в течение первых трех итераций печати на экране ничего не появится, потому что все сохранено. во временной памяти потока данных, который не будет отправлен дляmore
отображения на пользовательском терминале, пока не будет выполнен первыйstd::endl
.Вы можете увидеть здесь эффект, описанный выше:
Какие преимущества или использование они имеют
"\n"
иstd::endl
?Преимущество использования
"\n"
:Преимущества использования
std::endl
:При отправке текста на терминал пользователя удобно убедиться, что пользователь читает информацию, которую мы только что представили. Хотя операционная система автоматически очищает буфер, эта информация может не отображаться для пользователя при использовании средств улучшения отображения, таких как
more
,less
,tail -f
,cat
и т. д.При общении через соединение TCP или UNIX вы убедитесь, что поток данных был отправлен (обратите внимание, но это не означает, что он был прочитан на другом конце).