如何重定向 stdout 和 stderr 流(多平台)?

发布于 2024-12-14 09:47:28 字数 82 浏览 1 评论 0原文

我正在编写使用外部库的 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

撩心不撩汉 2024-12-21 09:47:28

您可以采用两种基本方法来实现此目的:

  1. 如果库都使用 std::cout 来捕获您想要捕获的 IO,您可以 编写您自己的 basic_streambuf。然后,您只需调用 std::cout.rdbuf(mybufinst); 即可替换流缓冲区,例如使用 std::basic_stringbuf:

    #include ;
    #include ;
    
    int main() {
       静态 std::basic_stringbuf缓冲区;
       std::cout.rdbuf(&buf);
       std::cout << “你好,捕获的世界!\n”;
       std::cerr << “偷:”<< buf.str() << std::endl;
    }
    
  2. 您可以使用特定于平台的方法,例如在 POSIX 系统上 dup2() 将允许您替换文件描述符与另一个文件描述符,或者在 Windows 上与 SetStdHandle()。您可能希望使用管道而不仅仅是另一个文件,并且您需要非常小心阻塞(因此可能需要专用线程)

There are two basic approaches you could take to this:

  1. If the libraries all use std::cout for the IO you want to capture you can write your own basic_streambuf. You can then just call std::cout.rdbuf(mybufinst); to replace the streambuffer, for example using the std::basic_stringbuf:

    #include <sstream>
    #include <iostream>
    
    int main() {
       static std::basic_stringbuf<std::ostream::char_type> buf;
       std::cout.rdbuf(&buf);
       std::cout << "Hello captured world!\n";
       std::cerr << "Stole: " << buf.str() << std::endl;
    }
    
  2. 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 with SetStdHandle(). 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)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文