将调试输出重定向到空流,而不是std :: cerr

Herzbube

我正在使用的软件库向写入了大量调试输出std::cerr,但是如果我告诉输出安静,则将该输出重定向到空流。这是简化main.cpp的代码,显示了代码如何尝试实现此目的:

#include <iostream>
#include <fstream>
#include <cassert>

// The stream that debug output is sent to. By default
// this points to std::cerr.
std::ostream* debugStream(&std::cerr);

// Throughout the library's codebase this function is called
// to get the stream that debug output should be sent to.
std::ostream& DebugStream()
{
    return *debugStream;
}

// Null stream. This file stream will never be opened and acts
// as a null stream for DebugStream().
std::ofstream nullStream;

// Redirects debug output to the null stream
void BeQuiet()
{
    debugStream = &nullStream;
}

int main(int argc, char** argv)
{
  DebugStream() << "foo" << std::endl;
  BeQuiet();
  DebugStream() << "bar" << std::endl;
  assert(debugStream->good());

  return 0;
}

当您运行该程序时,您会注意到字符串“ bar”已正确发送到空流。但是,我注意到断言失败。这是我应该关注的事情吗?还是这仅仅是库开发人员选择的方法的一点点丑陋细节?

如果您愿意,欢迎提供更好的替代方法的建议。一些约束:

  • 该库是跨平台的,因此我认为使用开放/dev/null不是有效的解决方案,因为它在Windows上不起作用
  • 该库使用标准的C ++,因此任何替代解决方案都不应使用特定于编译器的内容
迪特玛·库尔(DietmarKühl)

不必担心流不存在good()由于输出运算符实际上不会在故障模式下对流进行任何操作,因此未格式化所记录的不同实体,即,与替代方法相比,代码的运行速度更快。

请注意,您实际上并不需要第二个流来禁用输出:

  1. 假设所有输出运算符行为良好,则可以设置std::ios_base::failbit

    debugStream().setstate(std::ios_base::failbit);
    
  2. 如果存在行为不正确的输出,即使不是,good()也可以写入流,则可以将其流缓冲区设置为null:

    debugStream()。rdbuf(nullptr);

如果您确实希望流保持good()状态,则可以安装仅消耗字符的流缓冲区。但是请注意,您要为该流缓冲区提供一个缓冲区,因为overflow()为每个调用都char相当昂贵:

struct nullbuf
    : std::streambuf {
    char buf[256];
    int overflow(int c) {
        this->setp(this->buf, this->buf + 256);
        return std::char_traits<char>::not_eof(c);
    }
};
...
nullbuf sbuf;
debugStream().rdbuf(&sbuf);
...
debugStream().rdbuf(0);

必须重置流的流缓冲区,因为的析构函数std::ostream将刷新strsm缓冲区(即,它调用pubsync())。对已损坏的流缓冲区执行此操作将无效。

就个人而言,我会选择设置std::ios_base::failbit

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

尝试将 std::cerr 重定向到文件时访问冲突异常

来自分类Dev

std :: cout / std :: cerr seg faults

来自分类Dev

c ++中的cerr和cout意外输出

来自分类Dev

在Ubuntu中将C ++生成的cerr和cout重定向到同一文件

来自分类Dev

如果将cout,cerr和clog的rdbuf更改为重定向到文件,是否需要重置它们?

来自分类Dev

std :: cerr不等待std :: cout(运行CTest时)

来自分类Dev

我应该使用 std::cerr 和 exit() 而不是抛出异常吗?

来自分类Dev

我应该如何使用c ++处理“ std :: cerr”和“ std :: cin.fail()”?

来自分类Dev

使用cout,cerr,clog甚至用户定义的ostream输出到stdout和文件

来自分类Dev

有没有办法打开/关闭std:cerr(或等效功能)?

来自分类Dev

C ++-在检查变量的有效性时无法调用内联std :: cerr

来自分类Dev

将输出重定向到标准输出而不是文件

来自分类Dev

python:如何将文件输出重定向到流

来自分类Dev

用cerr修复的链表分割错误

来自分类Dev

Visual Studio 2012 Cout未显示但cerr

来自分类Dev

异步将std输出和err输出重定向到文件

来自分类Dev

使用setOutputStream将JSch exec通道的输出流重定向到文件不起作用

来自分类Dev

如何将二进制gbak输出重定向到Delphi流?

来自分类Dev

如何将“ wget”输出流重定向到“ sftp put”?

来自分类Dev

将标准输出重定向到文件

来自分类Dev

将Shell输出重定向到文件

来自分类Dev

将lldb输出重定向到文件

来自分类Dev

将xargs的输出重定向到文件

来自分类Dev

将输出从文件重定向到stdout

来自分类Dev

将标准输出重定向到整数

来自分类Dev

将Fabric输出重定向到文件

来自分类Dev

将流程输出重定向到JSON

来自分类Dev

将彩色输出重定向到文件

来自分类Dev

将错误重定向到标准输出

Related 相关文章

  1. 1

    尝试将 std::cerr 重定向到文件时访问冲突异常

  2. 2

    std :: cout / std :: cerr seg faults

  3. 3

    c ++中的cerr和cout意外输出

  4. 4

    在Ubuntu中将C ++生成的cerr和cout重定向到同一文件

  5. 5

    如果将cout,cerr和clog的rdbuf更改为重定向到文件,是否需要重置它们?

  6. 6

    std :: cerr不等待std :: cout(运行CTest时)

  7. 7

    我应该使用 std::cerr 和 exit() 而不是抛出异常吗?

  8. 8

    我应该如何使用c ++处理“ std :: cerr”和“ std :: cin.fail()”?

  9. 9

    使用cout,cerr,clog甚至用户定义的ostream输出到stdout和文件

  10. 10

    有没有办法打开/关闭std:cerr(或等效功能)?

  11. 11

    C ++-在检查变量的有效性时无法调用内联std :: cerr

  12. 12

    将输出重定向到标准输出而不是文件

  13. 13

    python:如何将文件输出重定向到流

  14. 14

    用cerr修复的链表分割错误

  15. 15

    Visual Studio 2012 Cout未显示但cerr

  16. 16

    异步将std输出和err输出重定向到文件

  17. 17

    使用setOutputStream将JSch exec通道的输出流重定向到文件不起作用

  18. 18

    如何将二进制gbak输出重定向到Delphi流?

  19. 19

    如何将“ wget”输出流重定向到“ sftp put”?

  20. 20

    将标准输出重定向到文件

  21. 21

    将Shell输出重定向到文件

  22. 22

    将lldb输出重定向到文件

  23. 23

    将xargs的输出重定向到文件

  24. 24

    将输出从文件重定向到stdout

  25. 25

    将标准输出重定向到整数

  26. 26

    将Fabric输出重定向到文件

  27. 27

    将流程输出重定向到JSON

  28. 28

    将彩色输出重定向到文件

  29. 29

    将错误重定向到标准输出

热门标签

归档