如何重定向stdout和stderr流(Multiplatform)?

时间:2011-11-10 08:42:08

标签: c++ console-application stdout stderr multiplatform

我正在编写使用外部库的GL应用程序,它会向控制台输出错误。我想抓住它并在游戏机控制台中打印。

PS:对不起,因为我的英语不好......

1 个答案:

答案 0 :(得分:3)

您可以采取两种基本方法:

  1. 如果所有库都使用std::cout作为您要捕获的IO,则可以write your own basic_streambuf。然后,您可以调用std::cout.rdbuf(mybufinst);来替换streambuffer,例如使用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. 您可以使用特定于平台的方法,例如在POSIX系统dup2() will allow you to replace a file descriptor with another one上,或在SetStdHandle()的Windows上。您可能希望使用管道而不仅仅是另一个文件,并且您需要非常小心阻塞(因此可能需要专用线程)