我正在寻找一个在C ++中区分cerr
和cout
的示例?
我何时需要使用cerr
?
答案 0 :(得分:6)
许多操作系统允许您将输入和输出重定向到/到文件。当最终用户将输出重定向到文件时,最终用户看不到您写入cout
的任何内容;如果您希望最终用户看到您的输出,则需要一个单独的流,您可以为其打印消息。
假设您正在编写一个逐行读取标准输入的程序,并按排序顺序将这些行写入标准输出。让我们假设您的程序采用命令行参数,该参数指示输出是否需要按升序或降序排序。如果最终用户为此参数传递了无效值,则需要向控制台输出消息"Invalid flag"
。将其打印到cout
将不正确,因为cout
可能会重定向到文件,因此用户不会看到它。在这种情况下,正确的解决方案是将此消息写入cerr
。
答案 1 :(得分:6)
程序的用户通常只对结果感兴趣,因为这些打印到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。当然,如果控制台的内容仅仅是副产品,那么这一切并不重要。但是,您可能仍希望允许用户将两者分开,如上例所示。
答案 2 :(得分:1)
std::cout
:常规输出(控制台输出)
std::cerr
:错误输出(控制台错误)
Google是你的朋友:)