gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:03:16 24 4
gpt4 key购买 nike

我想使用 Mr-Edd's iostreams article 中的这个片段在某处打印 std::clog。

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>

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 docs但我无法理解执行此操作的最佳方法。我有一个显示文本的方法,我只想用 ostringstream 中的任何数据调用它。

将发送到 std::clog 的任何内容重定向到我选择的方法的最简单/最佳方法是什么?是否如上所述,并填写 while !eof 部分(不确定如何填写),或者是否有更好的方法,比如在调用我的方法的某个地方重载一些“提交”运算符?我正在寻找快速和简单的方法,我真的不想像文章那样使用 boost iostream 开始定义接收器 - 这些东西超出了我的理解范围。

最佳答案

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

#include <boost/iostreams/concepts.hpp> 
#include <boost/iostreams/stream_buffer.hpp>
#include <iostream>

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<MySink> sb;
sb.open(MySink());
std::streambuf * oldbuf = std::clog.rdbuf(&sb);
std::clog << "hello, world" << std::endl;
std::clog.rdbuf(oldbuf);
return 0;
}

关于c++ - 将 std::cout 重定向到自定义编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/533038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com