简介在C++程序运行过程中,经常需要将程序的运行信息输出到文件中,以便跟踪程序运行结果。本文实现一个C++简单全局写日志函数,直接在项目开发中复用即可,感兴趣的朋友可以参考一下。
声明
// 写日志
int WriteLog(char* fmt, ...);
实现
// 写日志
int WriteLog(char* fmt, ...)
{
// 设置日志文件路径
char fileName[MAX_PATH];
TCHAR szFileToFind[MAX_PATH];
WIN32_FIND_DATA wfd;
BOOL rValue = FALSE;
CString strModule = _T("");
// 得到当前模块路径
TCHAR tcModule[MAX_PATH] = TEXT("");
GetModuleFileName(NULL, tcModule, MAX_PATH);
strModule = tcModule;
int iFind = strModule.ReverseFind('\\');
strModule = strModule.Left(iFind);
strModule += TEXT("\\Logs");
_tcscpy(szFileToFind, strModule.GetString());
HANDLE hFind = FindFirstFile(szFileToFind, &wfd);
if ((hFind != INVALID_HANDLE_VALUE) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
rValue = TRUE;
}
FindClose(hFind);
if (rValue == FALSE)
{
SECURITY_ATTRIBUTES attrib;
attrib.bInheritHandle = FALSE;
attrib.lpSecurityDescriptor = NULL;
attrib.nLength = sizeof(SECURITY_ATTRIBUTES);
if (FALSE == ::CreateDirectory(szFileToFind, &attrib))
{
return -1;
}
}
SYSTEMTIME st;
GetLocalTime(&st);
USES_CONVERSION;
sprintf(fileName, "%s\\cppszw_%04d%02d%02d.log", T2A(szFileToFind), st.wYear, st.wMonth, st.wDay);
// 打开文件
FILE* pFile = fopen(fileName, "a");
if (pFile == NULL)
{
return -1;
}
va_list arg;
va_start(arg, fmt);
// 写日志
fprintf(pFile, "%04d-%02d-%02d %02d:%02d:%02d.%03d: ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
vfprintf(pFile, fmt, arg);
va_end(arg);
fprintf(pFile, "\n"); // 换行
fflush(pFile);
fclose(pFile);
return 0;
}
需要包含头文件:
#include <io.h>
本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。