在C++中何时使用cerr和何时使用cout

When to use cerr and when cout in C++?

本文关键字:何时使 cout cerr C++      更新时间:2023-10-16

我正在寻找一个在C++中区分cerrcout的示例?

我什么时候需要使用cerr

程序的用户通常只对结果感兴趣,因为这些结果会打印到stdout,例如,如果您使用unix命令cat,例如:

$ cat file.txt

您期望file.txt内容出现在stdout上。然而,如果在执行cat的过程中发生了任何事情(严格地说,理论上我从未发生过任何事情),你会期望它进入stderr,因此,作为用户,你仍然可以将两者分开,例如:

$ cat file.txt 1>result.txt 2>stderr.txt

假设我想收集多个文件的内容,我会执行以下

$ cat *.java 1>all_files_conent.java 2>errors.txt

如果任何文件无法访问(例如,由于权限原因),errors.txt将显示相应的消息:

cat: Controller.java: Permission denied

但是all_files_content.java的内容是尽可能正确的。

因此,如果消息是程序的实际产品,则应该使用cout,如果只是状态消息,则使用cerr。当然,如果进入控制台的只是一个副产品,那么所有这些都无关紧要。但是,您可能仍然希望允许用户将两者分开,如上面的示例所示。

许多操作系统允许您将输入和输出从/重定向到文件。当最终用户将您的输出重定向到一个文件时,最终用户看不到您写入cout的任何内容;如果您想让最终用户看到您的输出,您需要一个单独的流来为他们打印消息。

假设您正在编写一个程序,该程序逐行读取标准输入,并按排序顺序将这些行写入标准输出。假设您的程序采用一个命令行参数,该参数指示输出是否需要按升序或降序排序。如果最终用户为此参数传递了无效值,则需要向控制台打印消息"Invalid flag"。将其打印到cout是不正确的,因为cout可以重定向到一个文件,所以用户看不到它。在这种情况下,正确的解决方案是将此消息写入cerr

std::cout:常规输出(控制台输出)

std::cerr:错误输出(控制台错误)

谷歌是你的朋友:)

您可以在此处的另一个问题下参考此答案。主要区别在于std::cerr没有缓冲,通常用于显示错误。但我也看到很多人使用std::cerr来输出任何你想立即看到的内容(你不想缓冲它),即使它不是错误消息。