何时使用cerr和C ++中的cout?

时间:2014-10-04 09:28:45

标签: c++ outputstream cout

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

我何时需要使用cerr

3 个答案:

答案 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是你的朋友:)