printf как в консольное окно, так и в файл? - PullRequest
0 голосов
/ 09 марта 2012

У меня есть много программ на C ++, которые компилируются с Visual Studio 2005. В основном это небольшие серверные модули, работающие в консольных окнах. В любом случае, проблема, с которой я сталкиваюсь, заключается в том, что текст может отображаться только в окне консоли или в файле журнала, но не в обоих случаях. Каждая программа имеет опцию командной строки для указания файла журнала. Вот функция, которую я вызываю для перенаправления stdout и stderr в файл.

void consoleobj::setstdouterr(const stringobj& printstr)
{
  #if !defined(_WIN32_WCE)
    freopen(printstr.c_str(),"w",stdout);
  #ifdef _MSC_VER 
    ::SetStdHandle(STD_ERROR_HANDLE,GetStdHandle(STD_OUTPUT_HANDLE));  
  #endif
  #endif
  // make log msgs flush to log file(cout does this(on \n?), printf doesn't)
  //now if both redir to same log file, msgs should be in right order
  setvbuf(stdout, NULL, _IONBF, 0);  //no buffering
  setvbuf(stderr, NULL, _IONBF, 0);  //no buffering
}//end method setstdouterr

Есть ли способ настроить что-либо, чтобы stdout и stderr записывались в и в окне консоли и в дополнительный файл журнала одновременно? Я видел код, который перенаправляет cout или функцию-обертку, но все наши операторы print используют printf, и я бы предпочел использовать функцию, аналогичную функции в нашей библиотеке consoleobj, чтобы установить это, если это возможно. Спасибо!

1 Ответ

1 голос
/ 09 марта 2012

Вместо реализации этой функциональности в вашем коде.
Вы можете использовать известную утилиту tee в Unix.
Существует версия для Windows под названием wtee.exe.

C:\> programm | wtee log.txt
...