如何重定向 stdout 和 stderr 流(多平台)?
我正在编写使用外部库的 GL 应用程序,它将错误打印到控制台。我想捕获它并在游戏控制台中打印。
PS:抱歉,我的英语不好......
I'm writing GL application that uses external libs, which print errors to the console. I want to catch that and print in the in-game console.
PS: Sorry, for my bad english....
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以采用两种基本方法来实现此目的:
如果库都使用
std::cout
来捕获您想要捕获的 IO,您可以 编写您自己的basic_streambuf
。然后,您只需调用 std::cout.rdbuf(mybufinst); 即可替换流缓冲区,例如使用std::basic_stringbuf
:您可以使用特定于平台的方法,例如在 POSIX 系统上
dup2()
将允许您替换文件描述符与另一个文件描述符,或者在 Windows 上与SetStdHandle()
。您可能希望使用管道而不仅仅是另一个文件,并且您需要非常小心阻塞(因此可能需要专用线程)
There are two basic approaches you could take to this:
If the libraries all use
std::cout
for the IO you want to capture you can write your ownbasic_streambuf
. You can then just callstd::cout.rdbuf(mybufinst);
to replace the streambuffer, for example using thestd::basic_stringbuf
:You can use a platform specific approach, e.g. on POSIX systems
dup2()
will allow you to replace a file descriptor with another one, or on Windows withSetStdHandle()
. You'd want to use pipes rather than just another file probably and you'd need to be really careful about blocking (so probably want a dedicated thread)