在C++中何时使用cerr和何时使用cout
When to use cerr and when cout in C++?
我正在寻找一个在C++中区分cerr
和cout
的示例?
我什么时候需要使用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
来输出任何你想立即看到的内容(你不想缓冲它),即使它不是错误消息。
- 何时使函数成为类成员函数C++?
- 为什么<<低;和 cout<<v.begin;单独给出错误,但 cout <<(lower.begin());没有给出任何错误,并使代码易于编译
- boost库的哪一部分使cout能够打印wstring以及如何打印?
- 何时必须使操作员<<过载?
- C++:当与 std::cout 一起使用时,constexpr 函数在编译时不会计算
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 将字符串转换为char,当我cout时,它是正确的,但是当我将chdir与char一起使用时,它不起作用
- 为什么在语句"std::cout << std::endl;"中使用时需要命名空间限定,给定依赖于参数的查找?
- 在C++中将cout与变量一起使用时出错
- 使类在流上模板化处理std::cout和std::of流
- std::cout每次使用时都会重新打印控制台中当前的所有内容
- C++:将'this'指针与"get"函数一起使用以替换 cout 语句的可能性
- 使std::cout在同一行中一个接一个地输出多个字符串
- 在C++中何时使用cerr和何时使用cout
- Apple C++ LLVM Compiler 4.x & UNICODE:何时需要?UNICODE 是默认编译器字符集吗?使代码同时编译 ANSI 和 UNICODE 版本
- 何时使用printf/scanf与cout/cin
- 如何使cout在页面满后停止输出文本?
- 如何使libcurl c++调用超时和/或知道调用中何时发生超时
- 为什么 cout<<hex satement 使其余部分仅以十六进制格式打印
- C++:cout 语句是否会使代码变慢