2012-03-09 110 views
0

我有很多用Visual Studio 2005編譯的C++程序。它們大多是在控制檯窗口中運行的小型服務器模塊。無論如何,我遇到的問題是文本只能顯示在控制檯窗口或日誌文件中,但不能同時顯示。每個程序都有一個命令行選項來指定日誌文件。這裏是我調用stdout和stderr重定向到文件的函數。printf到控制檯窗口和文件?

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 

有什麼辦法來設置的東西,所以輸出和錯誤被寫入控制檯窗口,同時可選的日誌文件?我看過重定向cout或包裝函數的代碼,但是我們的print語句都使用printf,而且我更喜歡使用類似於consoleobj庫中的函數來儘可能地設置它。謝謝!

+0

'dup2()'在Windows下工作嗎? – trojanfoe 2012-03-09 16:38:44

回答

1

而不是在您的代碼中實現此功能。
您可以在Unix中使用衆所周知的實用程序tee
它有一個Windows版本叫做wtee.exe

C:\> programm | wtee log.txt