複数のファイルを使用するマルチスレッド プログラムがあります。プログラムのエラーやさまざまな情報をログに記録するために、他のすべてのファイルに含まれるヘッダー ファイルで定義されている次のマクロを実際に使用します。
#define LOGFILENAME ("log.txt")
#define TRACE_LOG(msg) \
do { \
fstream logFile;\
logFile.open (((string)LOGFILENAME).c_str(), ios::out | ios::app);\
logFile << __FILE__<< "\t function:"<<__FUNCTION__<< "\t"<< " (line: "<< __LINE__<< "): "<<msg <<endl;\
logFile.close();\
} while(0)
書き込みごとにファイルを開いたり閉じたりしないように、この関数を(プロトタイプを変更せずに)変更したいと思います。次に、プログラムの実行中にグローバル ストリームに書き込み、実行の最後にストリームを出力テキスト ファイルに書き込もうとしました。私はこれを試しました:
static std::stringstream LOGSTRINGSTREAM(ios_base::out | ios_base::app); //global variable in the header file
// 新しい TRACE_LOG 関数:
#define TRACE_LOG(msg) \
do { \
LOGSTRINGSTREAM.seekp(0, std::ios::end);\
LOGSTRINGSTREAM << __FILE__<< "\t function:"<<__FUNCTION__<< "\t"<< " (line: "<< __LINE__<< "): "<<msg <<endl;\
} while(0)
//プログラム実行の最後に呼び出され、ストリームをファイルに書き込む関数:
#define WRITE_LOG() \
do { \
fstream logFile;\
logFile.open (((string)LOGFILENAME).c_str(), ios::out | ios::app);\
logFile << LOGSTRINGSTREAM.str();\
logFile.close();\
} while(0)
これらの変更を加えてプログラムを実行すると、(予想どおり) log.txt ファイルがリアルタイムで書き込まれませんが、プログラムの実行の最後に、最後のメッセージのみが log.txt ファイルに書き込まれます。グローバル変数の宣言に問題があると思いますが直せません。ご協力いただきありがとうございます。フレッド