许多操作系统允许您将输入和输出重定向到/到文件.当最终用户将输出重定向到文件时,最终用户看不到您写入的任何内容cout; 如果您希望最终用户看到您的输出,则需要一个单独的流,您可以为其打印消息.
假设您正在编写一个逐行读取标准输入的程序,并按排序顺序将这些行写入标准输出.假设您的程序采用命令行参数,该参数指示输出是否需要按升序或降序排序.如果最终用户为此参数传递了无效值,则需要将消息打印"Invalid flag"到控制台.cout将其打印为不正确,因为cout可能会重定向到文件,因此用户不会看到它.在这种情况下,正确的解决方案是将此消息写入cerr.
程序的用户通常只对结果感兴趣,因为这些是打印到stdout的,例如,如果你使用unix命令cat,例如:
$ cat file.txt
Run Code Online (Sandbox Code Playgroud)
您期望file.txt内容出现在stdout上.然而,如果在执行cat期间发生任何事情(严格来说理论上讲,没有任何事情发生在我身上),你会期望它去stderr,因此,作为一个用户,你仍然可以将两者分开,例如:
$ cat file.txt 1>result.txt 2>stderr.txt
Run Code Online (Sandbox Code Playgroud)
假设我想收集多个文件的内容,我会执行以下操作
$ cat *.java 1>all_files_conent.java 2>errors.txt
Run Code Online (Sandbox Code Playgroud)
如果任何文件不可访问(例如,由于权限),errors.txt将有适当的消息:
cat: Controller.java: Permission denied
Run Code Online (Sandbox Code Playgroud)
但是all_files_content.java的内容尽可能正确.
因此,如果消息是程序的实际产品,则应使用cout,如果它只是状态消息,请使用cerr.当然,如果控制台的内容仅仅是副产品,那么这一切并不重要.但是,您可能仍希望允许用户将两者分开,如上例所示.