1

デバッグ目的で、標準出力 (cout) をファイルにリダイレクトしようとしました

std::ofstream traceFile;
traceFile.open("c:/path/file.txt");
std::streambuf* fileBuff = traceFile.rdbuf();

std::cout.rdbuf(fileBuff);

std::cout << std::unitbuff;

std::cout << "disk is written\n";

ただし、新しいスレッドから cout を呼び出すと、コードがミューテックスでスタックします。(xmtx.c 39: _Mtxlock())。

どうすれば解決できますか?

ありがとうございました

4

2 に答える 2

1

この は私にとってはうまくいきますが、あなたのテストケースはそうではありません。私のマシンでは、コードはファイルから streambuf を二重に解放しているように見えましたが、この例では、デストラクタが呼び出される前にストリームバッファを元に戻しています。

于 2010-11-08T10:35:05.843 に答える
0

cout の streambuf をオリジナルにリセットする必要があるかもしれません。

std::ofstream traceFile;
traceFile.open("c:/path/file.txt");
std::streambuf* fileBuff = traceFile.rdbuf(), *origBuf;

origBuf = cout.rdbuf(); //Save cout's StreamBuf pointer
std::cout.rdbuf(fileBuff); //Set cout's StreamBuf to file's StreamBuf pointer

std::cout << std::unitbuff;

std::cout << "disk is written\n";
cout.rdbuf(origBuf);  //Reset cout's StreamBuf back to original

また、複数のスレッドが同時に同じファイルに書き込むことは許可されない場合があります。これが原因でミューテックスの取得に失敗している可能性があります。

于 2010-11-08T10:56:05.727 に答える