当前位置:  开发笔记 > 编程语言 > 正文

将std :: cout重定向到自定义编写器

如何解决《将std::cout重定向到自定义编写器》经验,为你挑选了2个好方法。

我想使用Mr-Edd的iostreams文章中的这个片段在某处打印std :: clog.

#include 
#include 
#include 
#include 

int main()
{
    std::ostringstream oss;

    // Make clog use the buffer from oss
    std::streambuf *former_buff =
        std::clog.rdbuf(oss.rdbuf());

    std::clog << "This will appear in oss!" << std::flush;

    std::cout << oss.str() << '\\n';

    // Give clog back its previous buffer
    std::clog.rdbuf(former_buff);

    return 0;
}

所以,在一个主循环中,我会做类似的事情

while (! oss.eof())
{
    //add to window text somewhere
}

这是ostringstream文档,但我无法理解这样做的最佳方法.我有一个显示文本的方法,我只想用ostringstream中的任何数据调用它.

将发送到std :: clog的任何内容重定向到我选择的方法的最简单/最好的方法是什么?它是如上所述,并填写while!eof部分(不确定如何),或者是否有更好的方法,比如通过在调用我的方法的地方重载一些'commit'运算符?我喜欢快速简单,我真的不想开始定义接收器,就像文章那样使用boost iostreams - 这些东西已经超出了我的想象.



1> Éric Malenfa..:

我鼓励你看看Boost.IOStreams.它似乎很适合您的用例,使用它非常简单:

#include  
#include 
#include 

namespace bio = boost::iostreams;

class MySink : public bio::sink
{
public:
    std::streamsize write(const char* s, std::streamsize n)
    {
        //Do whatever you want with s
        //...
        return n;
    }
};

int main()
{
    bio::stream_buffer sb;
    sb.open(MySink());
    std::streambuf * oldbuf = std::clog.rdbuf(&sb);
    std::clog << "hello, world" << std::endl;
    std::clog.rdbuf(oldbuf);
    return 0;
}



2> Evan Teran..:

你想从ostream中取出文本而不是空的.你可以这样做:

std::string s = oss.str();
if(!s.empty()) {
    // output s here
    oss.str(""); // set oss to contain the empty string
}

如果这不是您想要的,请告诉我.

当然,更好的解决方案是移除中间人,并在您真正想要的地方使用新的streambuf ,无需稍后进行探测.这样的事情(注意,这适用于每个char,但streambufs中还有很多缓冲选项):

class outbuf : public std::streambuf {
public:
    outbuf() {
        // no buffering, overflow on every char
        setp(0, 0);
    }

    virtual int_type overflow(int_type c = traits_type::eof()) {
        // add the char to wherever you want it, for example:
        // DebugConsole.setText(DebugControl.text() + c);
        return c;
    }
};

int main() {
    // set std::cout to use my custom streambuf
    outbuf ob;
    std::streambuf *sb = std::cout.rdbuf(&ob);

    // do some work here

    // make sure to restore the original so we don't get a crash on close!
    std::cout.rdbuf(sb);
    return 0;

}

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有