在我的项目(虚幻引擎4)中,我没有输出流 - 而不是我可以通过UE_LOG函数进行通信,这与printf()
非常相似。问题是我刚创建了一个.dll库(没有Unreal包含),我希望通过iostream
进行通信。我的想法是 - 在.dll库中我使用标准cout
将消息写入ostream,我在虚幻引擎函数中使用它,我以字符串的形式获取ostream
并将其输出到UE_LOG函数中
问题是我总是将std::cout
视为魔法的一部分,而不考虑内在的是什么(我很确定我们大多数人都这样做)。我怎么能处理这个?简单的方法不会起作用(比如抓住stringstream
并将其输出到UE_LOG中)。
答案 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