【问题标题】:How to disable std::cerr?如何禁用 std::cerr?
【发布时间】:2011-10-29 23:16:47
【问题描述】:

我有一个包含很多std::cerr的程序,它直接输出到我的终端。我想知道std::cerrstd::cout 之间有什么区别。以及如何禁用std::cerr(我不希望它输出到我的屏幕)?

【问题讨论】:

    标签: c++ console iostream standard-error


    【解决方案1】:

    在许多系统中,包括 Windows 和 Unix,有两个 standard output streams:stdout 和 stderr。

    通常,程序输出到标准输出,可以显示在屏幕上,或重定向到文件:program > output.txt 或重定向为另一个程序的输入program1 | program2。例如,您可以使用grep 工具通过运行program | grep searchword 在程序的输出中进行搜索。

    但是,如果发生错误,并且您将其打印到重定向的标准输出,用户将看不到它。这就是为什么会有第二个错误输出。此外,用户通常不希望将错误文本写入输出文件或馈送到 grep。

    运行程序时,您可以将其错误输出重定向到带有program 2>file 的文件。该文件可以是 /dev/null 或 &1,这意味着重定向到标准输出。

    【讨论】:

      【解决方案2】:

      正如其他人提到的,如果这是一个类 Unix 系统,那么 2>/dev/null 将 stderr (2) 重定向到天空中的大比特桶 (/dev/null)。

      但是这里没有人解释 stderr 和 stdout 之间的区别是什么,所以我觉得至少有义务触及这个话题。

      std::cout 是 标准输出 流。这通常是您的程序应该输出消息的地方。

      std::cerr 是 标准错误 流。这通常用于错误消息。

      因此,如果您的程序“包含大量 cerr”输出,那么可能值得看看 为什么 会打印这么多错误消息,而不是简单地隐藏这些消息。当然,这是假设您不只是碰巧有一个程序出于某种原因向 stderr 发出大量非错误输出。

      【讨论】:

      • 当您将输出从一个程序传输到另一个程序时,区别很重要 - 您不希望下一个程序尝试解释您的错误消息,您希望在控制台。
      • 这回答了 OP 的第一个问题,但不是第二个问题。上面 Jared 所做的假设在我的情况下是错误的和不可改变的(这让我想到了这个问题)。我有一个特定的程序,我无法更改要删除的垃圾邮件std::cerr
      【解决方案3】:

      2>/dev/null 可以解决问题。再一次,我需要弥补 30 个字符。

      【讨论】:

        【解决方案4】:

        这个旧新闻组帖子显示了如何redirect(代码太大,无法在此处发布)。您需要使用streambuf* rdbuf

        cerr 是类ostream 的对象,表示标准错误流。它与 cstdio 流 stderr 相关联。

        默认情况下,大多数系统都将其标准错误输出设置为控制台,其中显示文本消息,但通常可以重定向。

        因为cerrostream 类的对象,我们可以使用插入运算符(ostream::operator

        【讨论】:

          【解决方案5】:

          假设此程序在 *nix 系统上执行,一种可能是将 stderr 重定向到 /dev/null。

          【讨论】:

            猜你喜欢
            • 2013-03-12
            • 1970-01-01
            • 2015-08-16
            • 2013-02-08
            • 1970-01-01
            • 2014-07-02
            • 2016-03-02
            • 1970-01-01
            • 2015-06-29
            相关资源
            最近更新 更多