Namespaces
Variants

std:: endl

From cppreference.net
< cpp ‎ | io ‎ | manip
定义于头文件 <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 ( ) 一样。

这是一个仅输出的I/O操纵器,可通过诸如 out << std :: endl 的表达式调用,其中 out 可以是任意 std::basic_ostream 类型的输出流。

目录

注释

该操纵符可用于立即生成输出行,例如在显示长时间运行进程的输出、记录多线程活动或记录可能意外崩溃的程序活动时。如果在调用 std::cout 之前生成的新进程执行任何屏幕I/O操作,则必须显式刷新 std::system 。在大多数其他常见的交互式I/O场景中,当与 std::cout 一起使用时, std::endl 是冗余的——因为来自 std::cin 的任何输入、输出到 std::cerr 或程序终止都会强制调用 std:: cout . flush ( ) 。某些资料鼓励使用 std::endl 代替 ' \n ' ,但这可能会显著降低输出性能。

在许多实现中,标准输出是行缓冲的,写入 ' \n ' 总会引起刷新,除非执行了 std :: ios :: sync_with_stdio ( false ) 。在这些情况下,不必要的 endl 只会降低文件输出的性能,而不会影响标准输出。

本维基上的代码示例 遵循 Bjarne Stroustrup 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> 的公开成员函数)