Как перенаправить потоки stdout и stderr (многоплатформенный)?

Я пишу приложение GL, которое использует внешние библиотеки, которые выводят ошибки на консоль. Я хочу поймать это и распечатать во внутриигровой консоли.

PS: Извините, за мой плохой английский....


person liljaylj    schedule 10.11.2011    source источник


Ответы (1)


Для этого можно использовать два основных подхода:

  1. Если все библиотеки используют std::cout для ввода-вывода, который вы хотите захватить, вы можете написать свой собственный basic_streambuf. Затем вы можете просто вызвать std::cout.rdbuf(mybufinst);, чтобы заменить потоковый буфер, например, используя 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() позволит вам заменить дескриптор файла другим один или в Windows с SetStdHandle(). Возможно, вы захотите использовать каналы, а не просто другой файл, и вам нужно быть очень осторожным с блокировкой (поэтому, вероятно, вам нужен выделенный поток)

person Flexo    schedule 10.11.2011