0

パラメータがfalseの場合、アサート出力をファイルにリダイレクトすることは可能ですか? デフォルトの動作は stderr にメッセージを書き込むことだとわかっていますが、以下は期待どおりに機能しませんでした。

#include <iostream>
#include <assert>
#include <fstream>
using namespace std;
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
   ofstream ofs;
   ofs.open("test.txt", ios_base::out);
   ofs << "A";
   cerr << "B";
   cerr.rdbuf(ofs.rdbuf());
   cerr << "C";
   assert(1 == 2);
   return 0;
}
//---------------------------------------------------------------------------

test.txtの結果:

AC

そして結果は stdout になります:

B
Assertion failed: 1 == 2, file C:\xxx\Unit1.cpp, line 14
Abnormal program termination

ただし、標準出力に出力されたこれらの最後の2行はtest.txtファイルにあると予想していました。私も試してみましたが、代わりに...

cerr.rdbuf(ofs.rdbuf());

以下:

freopen("test.txt", "a", stderr);

しかし、それはうまくいきませんでした。

unistd.hで定義されている stderr などのストリームをリダイレクトするようにdup2を提案するいくつかの投稿 ( C: how to redirect stderr from System-command to stdout or file?など) も見ました。しかし、私は Windows で C++Builder を使用していますが、利用できないようです。

4

1 に答える 1

2

プログラムの開始時に、すべての出力を stderr にリダイレクトするか、その他の標準ファイル ハンドルをファイルにリダイレクトできます。

   freopen( "error.log","w",stderr);

これについてはこちらをご覧ください:

http://support.microsoft.com/kb/58667

@edit: 出力が stdout に送られる場合は、次のことを行う必要があります。

   freopen( "error.log","w",stdout );

error.log を上書きせずに追加する場合:

   freopen( "error.log","aw",stdout );
于 2012-08-07T18:30:46.753 に答える