0

複数のファイルを使用するマルチスレッド プログラムがあります。プログラムのエラーやさまざまな情報をログに記録するために、他のすべてのファイルに含まれるヘッダー ファイルで定義されている次のマクロを実際に使用します。

#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 ファイルに書き込まれます。グローバル変数の宣言に問題があると思いますが直せません。ご協力いただきありがとうございます。フレッド

4

0 に答える 0