c 中 iostream 标头的 cout、cerr、clog 有什么区别?什么时候用哪一个?

新手上路,请多包涵

我尝试在互联网上研究 coutcerrclog 之间的区别,但找不到完美的答案。我仍然不清楚何时使用哪个。谁能通过简单的程序向我解释并说明何时使用哪一个的完美情况?

我访问了 这个网站,它在 cerrclog 上显示了一个小程序,但是在那里获得的输出也可以使用 cout 获得。所以,我对每个人的确切用途感到困惑。

原文由 Arlene Batada 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 675
2 个回答

stdoutstderr 是不同的流,即使它们都默认引用控制台输出。重定向(管道)其中一个(例如 program.exe >out.txt )不会影响另一个。

实际程序输出一般使用 stdout ,而所有信息和错误信息都应该打印到 stderr ,这样如果用户重定向输出到文件,信息消息仍然是打印在屏幕上,而不是输出文件。

原文由 riv 发布,翻译遵循 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 ; cerrclogstderr

标准输出 ( stdout ) 旨在接收来自程序的非错误、非诊断输出,例如可以显示给最终用户或流式传输到某些进一步处理阶段的成功处理的输出。

标准错误 ( stderr ) 用于诊断输出,例如指示程序没有或可能没有产生用户可能期望的输出的警告和错误消息。例如,即使输出数据通过管道传送到进一步的处理阶段,也可以将其显示给最终用户,或者可以将其重定向到日志文件。

cincerr 绑定到 cout

在自己处理 I/O 操作之前,它们都会刷新 cout 。这确保了发送到 cout 的提示在程序块从 cin 读取输入之前可见,并且在写入错误之前通过 cerr cout 的早期输出被刷新 --- ,当两者都被定向到相同的终端/文件/等时,它使消息按生成的时间顺序排列。

这与 clog 形成对比——如果你写在那里,它不会被缓冲并且不绑定到任何东西,所以它会在刷新之前缓冲相当数量的日志记录。这会产生最高的消息吞吐量,但意味着即使错误是通过 cerr 写入并显示在屏幕上,潜在的消费者阅读终端或跟踪日志也可能无法快速看到这些消息或在日志中。

原文由 Tony Delroy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题