【发布时间】:2014-11-29 06:00:49
【问题描述】:
我正在寻找一个在 C++ 中区分 cerr 和 cout 的示例?
什么时候需要使用cerr?
【问题讨论】:
-
程序的预期输出应该去std::cout。会破坏程序输出的意外警告或错误消息应该发送到 std::cerr。您通常不希望将程序生成的输出与信息报告混为一谈。
标签: c++ outputstream cout
我正在寻找一个在 C++ 中区分 cerr 和 cout 的示例?
什么时候需要使用cerr?
【问题讨论】:
标签: c++ outputstream cout
许多操作系统允许您重定向文件的输入和输出。当最终用户将您的输出重定向到文件时,最终用户看不到您向cout 写入的任何内容;如果您希望最终用户看到您的输出,则需要一个单独的流,您可以在其中为他们打印消息。
假设您正在编写一个程序,它逐行读取标准输入,并将这些行按排序顺序写入标准输出。假设您的程序接受一个命令行参数,该参数说明输出是否需要按升序或降序排序。如果最终用户为此参数传递了无效值,您希望将消息"Invalid flag" 打印到控制台。将其打印到cout 是不正确的,因为cout 可以被重定向到一个文件,所以用户不会看到它。这种情况下正确的解决办法是把这条消息写到cerr。
【讨论】:
您的程序的用户通常只对结果感兴趣,因为这些结果会打印到标准输出,例如,如果您使用 unix 命令 cat,例如:
$ cat file.txt
您希望 file.txt 内容出现在标准输出上。但是,如果在执行 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。当然,如果进入控制台的只是副产品,那么这一切都无关紧要。但是,您可能仍希望允许用户将两者分开,如上例所示。
【讨论】:
std::cout:常规输出(控制台输出)
std::cerr:错误输出(控制台错误)
Google 是你的朋友 :)
【讨论】: