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