std::endl
Определено в заголовке <ostream> | ||
|---|---|---|
template< class CharT, class Traits > std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os ); |
Вставляет символ новой строки в выходную последовательность os и сбрасывает её, как если бы вызывали os.put(os.widen('\n')) , за которым следует os.flush().
Это манипулятор ввода-вывода только для вывода, его можно вызвать с выражением, таким как out << std::endl для любого out типа std::basic_ostream.
Примечания
Этот манипулятор можно использовать для немедленного вывода строки, например, при отображении вывода из длительной операции, регистрации активности нескольких потоков или регистрации активности программы, которая может неожиданно завершиться. Явное сброс std::cout также необходим перед вызовом std::system, если запущенный процесс выполняет вывод на экран. В большинстве других обычных сценариев интерактивного ввода-вывода std::endl избыточно, когда используется с std::cout, поскольку любой ввод от std::cin, вывод на std::cerr или завершение программы принудительно вызывают std::cout.flush(). Использование std::endl вместо '\n', рекомендованное некоторыми источниками, может значительно снизить производительность вывода.
Во многих реализациях стандартный вывод буферизуется по строкам, и запись '\n' вызывает сброс в любом случае, если std::ios::sync_with_stdio(false) не был выполнен. В этих ситуациях ненужный endl снижает производительность только вывода в файл, а не стандартного вывода.
Примеры кода на этой вики следуют за Бьярном Страуструпом и Руководством по C++ по сбросу стандартного вывода только в необходимых случаях.
Когда необходимо сбросить неполную строку вывода, можно использовать манипулятор std::flush.
Когда необходимо сбросить каждый символ вывода, можно использовать манипулятор std::unitbuf.
Параметры
| os | - | ссылка на поток вывода |
Возвращаемое значение
os (ссылка на поток после манипуляции).
Пример
При использовании '\n' вместо endl, вывод будет таким же, но может не отображаться в реальном времени.
#include <chrono>
#include <iostream>
template<typename Diff>
void log_progress(Diff d)
{
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d)
<< " passed" << std::endl;
}
int main()
{
std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n
static volatile int sink{};
const auto t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 10000; ++j)
for (int k = 0; k < 20000; ++k)
sink += i * j * k; // do some work
log_progress(std::chrono::high_resolution_clock::now() - t1);
}
}Возможный вывод:
566ms passed 1133ms passed 1699ms passed 2262ms passed 2829ms passed
См. также
| управляет тем, сбрасывается ли вывод после каждой операции (функция) |
|
| сбрасывает поток вывода (функция-шаблон) |
|
| синхронизирует с основным устройством хранения (публичный член-функция std::basic_ostream<CharT,Traits>) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/manip/endl