2012-03-09 4 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 

ので、stdoutとstderrは両方コンソールウィンドウと同時に、オプションのログファイルに書き込まれます物事を設定する方法はありますか?私はcoutやラッパー関数をリダイレクトするコードを見たことがありますが、私たちのprintステートメントはすべてprintfを使用しています。可能であれば、私たちのconsoleobjライブラリに似た関数を使用したいと思います。ありがとう!

+0

Windowsでは 'dup2()'は動作しますか? – trojanfoe

答えて

1

コードでこの機能を実装する代わりに。
よく知られているユーティリティteeをUnixで使用できます。
wtee.exeと呼ばれるWindows版があります。

C:\> programm | wtee log.txt 
関連する問題