C++說話編寫寫日記類。本站提示廣大學習愛好者:(C++說話編寫寫日記類)文章只能為提供參考,不一定能成為您想要的結果。以下是C++說話編寫寫日記類正文
應用C++說話編寫寫日記類,支撐寫日記級別設置、支撐多線程、支撐可變形參表寫日記。
重要供給以下接口:
#ifndef COMMAND_DEFINE_H #define COMMAND_DEFINE_H //日記級其余提醒信息 static const char * KEYINFOPREFIX = " Key: \n"; static const char * ERRORPREFIX = " Error: \n"; static const char * WARNINGPREFIX = " Warning: \n"; static const char * INFOPREFIX = " Info: \n"; static const int MAX_STR_LEN = 1024; //日記級別列舉 typedef enum EnumLogLevel { LogLevelAll = 0, //一切信息都寫日記 LogLevelMid, //寫毛病、正告信息 LogLevelNormal, //只寫毛病信息 LogLevelStop //不寫日記 }; #endif
#ifndef LOGGER_H_ #define LOGGER_H_ #include <Windows.h> #include <stdio.h> #include "CommandDefine.h" /* * 類名:Logger * 感化:供給寫日記功效,支撐多線程,支撐可變形參數操作,支撐寫日記級其余設置 * 接口:SetLogLevel:設置寫日記級別 TraceKeyInfo:疏忽日記級別,寫症結信息 TraceError:寫毛病信息 TraceWarning:寫正告信息 TraceInfo:寫普通信息 */ class Logger { public: //默許結構函數 Logger(); //結構函數 Logger(const char * strLogPath, EnumLogLevel nLogLevel = EnumLogLevel::LogLevelNormal); //析構函數 virtual ~Logger(); public: //寫症結信息 void TraceKeyInfo(const char * strInfo, ...); //寫毛病信息 void TraceError(const char* strInfo, ...); //寫正告信息 void TraceWarning(const char * strInfo, ...); //寫普通信息 void TraceInfo(const char * strInfo, ...); //設置寫日記級別 void SetLogLevel(EnumLogLevel nLevel); private: //寫文件操作 void Trace(const char * strInfo); //獲得以後體系時光 char * GetCurrentTime(); //創立日記文件稱號 void GenerateLogName(); //創立日記途徑 void CreateLogPath(); private: //寫日記文件流 FILE * m_pFileStream; //寫日記級別 EnumLogLevel m_nLogLevel; //日記的途徑 char m_strLogPath[MAX_STR_LEN]; //日記的稱號 char m_strCurLogName[MAX_STR_LEN]; //線程同步的臨界區變量 CRITICAL_SECTION m_cs; }; #endif
#include "Logger.h" #include <imagehlp.h> #include <time.h> #include <string.h> #include <stdarg.h> #pragma comment(lib, "DbgHelp.lib") //默許結構函數 Logger::Logger() { //初始化 memset(m_strLogPath, 0, MAX_STR_LEN); memset(m_strCurLogName, 0, MAX_STR_LEN); m_pFileStream = NULL; //設置默許的寫日記級別 m_nLogLevel = EnumLogLevel::LogLevelNormal; //初始化臨界區變量 InitializeCriticalSection(&m_cs); //創立日記文件名 GenerateLogName(); } //結構函數 Logger::Logger(const char * strLogPath, EnumLogLevel nLogLevel):m_nLogLevel(nLogLevel) { //初始化 m_pFileStream = NULL; strcpy(m_strLogPath, strLogPath); InitializeCriticalSection(&m_cs); CreateLogPath(); GenerateLogName(); } //析構函數 Logger::~Logger() { //釋放臨界區 DeleteCriticalSection(&m_cs); //封閉文件流 if(m_pFileStream) fclose(m_pFileStream); } //寫症結信息接口 void Logger::TraceKeyInfo(const char * strInfo, ...) { if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, KEYINFOPREFIX); //獲得可變形參 va_list arg_ptr = NULL; va_start(arg_ptr, strInfo); vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr); va_end(arg_ptr); //寫日記文件 Trace(pTemp); arg_ptr = NULL; } //寫毛病信息 void Logger::TraceError(const char* strInfo, ...) { //斷定以後的寫日記級別,若設置為不寫日記則函數前往 if(m_nLogLevel >= EnumLogLevel::LogLevelStop) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, ERRORPREFIX); va_list arg_ptr = NULL; va_start(arg_ptr, strInfo); vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr = NULL; } //寫正告信息 void Logger::TraceWarning(const char * strInfo, ...) { //斷定以後的寫日記級別,若設置為只寫毛病信息則函數前往 if(m_nLogLevel >= EnumLogLevel::LogLevelNormal) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp, WARNINGPREFIX); va_list arg_ptr = NULL; va_start(arg_ptr, strInfo); vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr = NULL; } //寫普通信息 void Logger::TraceInfo(const char * strInfo, ...) { //斷定以後的寫日記級別,若設置只寫毛病和正告信息則函數前往 if(m_nLogLevel >= EnumLogLevel::LogLevelMid) return; if(!strInfo) return; char pTemp[MAX_STR_LEN] = {0}; strcpy(pTemp, GetCurrentTime()); strcat(pTemp,INFOPREFIX); va_list arg_ptr = NULL; va_start(arg_ptr, strInfo); vsprintf(pTemp + strlen(pTemp), strInfo, arg_ptr); va_end(arg_ptr); Trace(pTemp); arg_ptr = NULL; } //獲得體系以後時光 char * Logger::GetCurrentTime() { time_t curTime; struct tm * pTimeInfo = NULL; time(&curTime); pTimeInfo = localtime(&curTime); char temp[MAX_STR_LEN] = {0}; sprintf(temp, "%02d:%02d:%02d", pTimeInfo->tm_hour, pTimeInfo->tm_min, pTimeInfo->tm_sec); char * pTemp = temp; return pTemp; } //設置寫日記級別 void Logger::SetLogLevel(EnumLogLevel nLevel) { m_nLogLevel = nLevel; } //寫文件操作 void Logger::Trace(const char * strInfo) { if(!strInfo) return; try { //進入臨界區 EnterCriticalSection(&m_cs); //若文件流沒有翻開,則從新翻開 if(!m_pFileStream) { char temp[1024] = {0}; strcat(temp, m_strLogPath); strcat(temp, m_strCurLogName); m_pFileStream = fopen(temp, "a+"); if(!m_pFileStream) { return; } } //寫日記信息到文件流 fprintf(m_pFileStream, "%s\n", strInfo); fflush(m_pFileStream); //分開臨界區 LeaveCriticalSection(&m_cs); } //若產生異常,則先分開臨界區,避免逝世鎖 catch(...) { LeaveCriticalSection(&m_cs); } } //創立日記文件的稱號 void Logger::GenerateLogName() { time_t curTime; struct tm * pTimeInfo = NULL; time(&curTime); pTimeInfo = localtime(&curTime); char temp[1024] = {0}; //日記的稱號如:2013-01-01.log sprintf(temp, "%04d-%02d-%02d.log", pTimeInfo->tm_year+1900, pTimeInfo->tm_mon + 1, pTimeInfo->tm_mday); if(0 != strcmp(m_strCurLogName, temp)) { strcpy(m_strCurLogName,temp); if(m_pFileStream) fclose(m_pFileStream); char temp[1024] = {0}; strcat(temp, m_strLogPath); strcat(temp, m_strCurLogName); //以追加的方法翻開文件流 m_pFileStream = fopen(temp, "a+"); } } //創立日記文件的途徑 void Logger::CreateLogPath() { if(0 != strlen(m_strLogPath)) { strcat(m_strLogPath, "\\"); } MakeSureDirectoryPathExists(m_strLogPath); }
以上就是本文的全體內容,願望對年夜家的進修C++有所贊助。