【发布时间】:2011-10-29 23:16:47
【问题描述】:
我有一个包含很多std::cerr的程序,它直接输出到我的终端。我想知道std::cerr 和std::cout 之间有什么区别。以及如何禁用std::cerr(我不希望它输出到我的屏幕)?
【问题讨论】:
标签: c++ console iostream standard-error
我有一个包含很多std::cerr的程序,它直接输出到我的终端。我想知道std::cerr 和std::cout 之间有什么区别。以及如何禁用std::cerr(我不希望它输出到我的屏幕)?
【问题讨论】:
标签: c++ console iostream standard-error
在许多系统中,包括 Windows 和 Unix,有两个 standard output streams:stdout 和 stderr。
通常,程序输出到标准输出,可以显示在屏幕上,或重定向到文件:program > output.txt 或重定向为另一个程序的输入program1 | program2。例如,您可以使用grep 工具通过运行program | grep searchword 在程序的输出中进行搜索。
但是,如果发生错误,并且您将其打印到重定向的标准输出,用户将看不到它。这就是为什么会有第二个错误输出。此外,用户通常不希望将错误文本写入输出文件或馈送到 grep。
运行程序时,您可以将其错误输出重定向到带有program 2>file 的文件。该文件可以是 /dev/null 或 &1,这意味着重定向到标准输出。
【讨论】:
正如其他人提到的,如果这是一个类 Unix 系统,那么 2>/dev/null 将 stderr (2) 重定向到天空中的大比特桶 (/dev/null)。
但是这里没有人解释 stderr 和 stdout 之间的区别是什么,所以我觉得至少有义务触及这个话题。
std::cout 是 标准输出 流。这通常是您的程序应该输出消息的地方。
std::cerr 是 标准错误 流。这通常用于错误消息。
因此,如果您的程序“包含大量 cerr”输出,那么可能值得看看 为什么 会打印这么多错误消息,而不是简单地隐藏这些消息。当然,这是假设您不只是碰巧有一个程序出于某种原因向 stderr 发出大量非错误输出。
【讨论】:
std::cerr。
2>/dev/null 可以解决问题。再一次,我需要弥补 30 个字符。
【讨论】:
这个旧新闻组帖子显示了如何redirect。 (代码太大,无法在此处发布)。您需要使用streambuf* rdbuf。
cerr 是类ostream 的对象,表示标准错误流。它与 cstdio 流 stderr 相关联。
默认情况下,大多数系统都将其标准错误输出设置为控制台,其中显示文本消息,但通常可以重定向。
因为cerr 是ostream 类的对象,我们可以使用插入运算符(ostream::operator
【讨论】:
假设此程序在 *nix 系统上执行,一种可能是将 stderr 重定向到 /dev/null。
【讨论】: