How to redirect stdout and stderr streams (Multiplatform)?

旧城冷巷雨未停 提交于 2019-12-02 04:15:39


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....


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 << "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)