How to redirect stdout and stderr streams (Multiplatform)?

前端 未结 1 1058
名媛妹妹
名媛妹妹 2021-01-21 23:31

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 engl

相关标签:
1条回答
  • 2021-01-22 00:22

    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)

    0 讨论(0)
提交回复
热议问题