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 ( ) 一样。
这是一个仅输出的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>
的公开成员函数)
|