std :: cout,ostream和其他种类的输出流

时间:2016-09-11 10:03:59

标签: c++ std iostream

在我的项目(虚幻引擎4)中,我没有输出流 - 而不是我可以通过UE_LOG函数进行通信,这与printf()非常相似。问题是我刚创建了一个.dll库(没有Unreal包含),我希望通过iostream进行通信。我的想法是 - 在.dll库中我使用标准cout将消息写入ostream,我在虚幻引擎函数中使用它,我以字符串的形式获取ostream并将其输出到UE_LOG函数中

问题是我总是将std::cout视为魔法的一部分,而不考虑内在的是什么(我很确定我们大多数人都这样做)。我怎么能处理这个?简单的方法不会起作用(比如抓住stringstream并将其输出到UE_LOG中)。

2 个答案:

答案 0 :(得分:2)

  

我的想法是 - 在.dll库中我使用标准cout将消息写入ostream

您实际上可以将std::cout使用的输出缓冲区替换为您自己的实现。使用std::ostream::rdbuf()函数执行此操作(参考文档中的示例):

#include <iostream>
#include <sstream>

int main()
{
    std::ostringstream local;
    auto cout_buff = std::cout.rdbuf(); // save pointer to std::cout buffer

    std::cout.rdbuf(local.rdbuf()); // substitute internal std::cout buffer with
        // buffer of 'local' object

    // now std::cout work with 'local' buffer
    // you don't see this message
    std::cout << "some message";

    // go back to old buffer
    std::cout.rdbuf(cout_buff);

    // you will see this message
    std::cout << "back to default buffer\n";

    // print 'local' content
    std::cout << "local content: " << local.str() << "\n";
}

答案 1 :(得分:0)

(如果我的编辑未获得正面评审)

来自OP:感谢您的提示,我终于找到了如何解决我的问题。假设我想从cout获取流并将其发送到printf(因为我认为stdio库优于iostream)。我在这里如何做到这一点:

#include <iostream>
#include <sstream>
#include <cstdio>

using namespace std;

class ssbuf : public stringbuf{
protected:
    int sync(){
        printf("My buffer: %s",this->str().c_str());
        str("");
        return this->stringbuf::sync();
    }
};


int main(){
    ssbuf *buf = new ssbuf();
    cout.rdbuf(buf);
    cout<<"This is out stream "<<"and you cant do anything about it"<<endl;
    cout<<"(don't) "<<"Vote Trump"<<endl;
}

代码是非常原始的,但它确实是它的工作。我制作了缓冲区的子类,它有方法sync()向下转换原始虚方法sync()。除此之外,它像通常的缓冲区一样工作,只是抓住所有控制台输出流 - 正是我们想要的。内部的str(&#34;&#34;)是清理缓冲区 - 可能没有输出的流不会自行清理。

非常感谢您的帮助! Big GRIN适合你! :d