我有一个使用多个文件的多线程程序。为了记录我的程序的错误和不同信息,我实际上使用了在所有其他文件中包含的头文件中定义的以下宏:
#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 文件中。我认为全局变量的声明存在问题,但我无法修复它。谢谢你的帮助。弗雷德