我尝试在互联网上研究 cout
、 cerr
和 clog
之间的区别,但找不到完美的答案。我仍然不清楚何时使用哪个。谁能通过简单的程序向我解释并说明何时使用哪一个的完美情况?
我访问了 这个网站,它在 cerr
和 clog
上显示了一个小程序,但是在那里获得的输出也可以使用 cout
获得。所以,我对每个人的确切用途感到困惑。
原文由 Arlene Batada 发布,翻译遵循 CC BY-SA 4.0 许可协议
我尝试在互联网上研究 cout
、 cerr
和 clog
之间的区别,但找不到完美的答案。我仍然不清楚何时使用哪个。谁能通过简单的程序向我解释并说明何时使用哪一个的完美情况?
我访问了 这个网站,它在 cerr
和 clog
上显示了一个小程序,但是在那里获得的输出也可以使用 cout
获得。所以,我对每个人的确切用途感到困惑。
原文由 Arlene Batada 发布,翻译遵循 CC BY-SA 4.0 许可协议
来自 C++17 标准文档草案:
30.4.3 窄流对象 [narrow.stream.objects]
istream cin;
1 对象
cin
控制来自与对象stdin
关联的流缓冲区的输入,在<cstdio>
(30.11.1) 中声明。2 对象
cin
初始化后,cin.tie()
返回&cout
。其状态与basic_ios<char>::init
(30.5.5.2) 所需的其他状态相同。
ostream cout;
3 对象
cout
控制输出到与对象stdout
关联的流缓冲区,在<cstdio>
(30.11.1) 中声明
ostream cerr;
4 对象
cerr
控制输出到与对象stderr
关联的流缓冲区,在<cstdio>
(30.11.1) 中声明。5 在对象
cerr
被初始化之后,cerr.flags() & unitbuf
非零并且cerr.tie()
返回&cout
其状态与basic_ios<char>::init
(30.5.5.2) 所需的其他状态相同。
ostream clog;
6 对象
clog
控制输出到与对象stderr
关联的流缓冲区,在<cstdio>
(30.11.1) 中声明。
cout
写入 stdout
; cerr
和 clog
到 stderr
标准输出 ( stdout
) 旨在接收来自程序的非错误、非诊断输出,例如可以显示给最终用户或流式传输到某些进一步处理阶段的成功处理的输出。
标准错误 ( stderr
) 用于诊断输出,例如指示程序没有或可能没有产生用户可能期望的输出的警告和错误消息。例如,即使输出数据通过管道传送到进一步的处理阶段,也可以将其显示给最终用户,或者可以将其重定向到日志文件。
cin
和 cerr
绑定到 cout
在自己处理 I/O 操作之前,它们都会刷新 cout
。这确保了发送到 cout
的提示在程序块从 cin
读取输入之前可见,并且在写入错误之前通过 cerr
cout
的早期输出被刷新 ---
,当两者都被定向到相同的终端/文件/等时,它使消息按生成的时间顺序排列。
这与 clog
形成对比——如果你写在那里,它不会被缓冲并且不绑定到任何东西,所以它会在刷新之前缓冲相当数量的日志记录。这会产生最高的消息吞吐量,但意味着即使错误是通过 cerr
写入并显示在屏幕上,潜在的消费者阅读终端或跟踪日志也可能无法快速看到这些消息或在日志中。
原文由 Tony Delroy 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.5k 阅读
3 回答494 阅读✓ 已解决
stdout
和stderr
是不同的流,即使它们都默认引用控制台输出。重定向(管道)其中一个(例如program.exe >out.txt
)不会影响另一个。实际程序输出一般使用
stdout
,而所有信息和错误信息都应该打印到stderr
,这样如果用户重定向输出到文件,信息消息仍然是打印在屏幕上,而不是输出文件。