VC++使用fprintf函数实现写日志文件的功能(附源码)

        输出打印日志是排查软件异常问题一个非常重要的手段,无论是业务上的异常,还是软件异常崩溃。一个成熟的软件产品,必然有一个功能完备的日志记录与打印系统。本文就来介绍一种简单易用的写日志文件的方法,给大家提供一个参考。

VC++使用fprintf函数实现写日志文件的功能(附源码)_第1张图片

1、实现思路

       主要使用C库中的fopenfprintffclose等接口来实现。具体地是,先调用fopen打开或创建日志文件,然后调用fprintf将要记录的日志写到文件中,最后调用fclose将文件关闭掉。

2、支持ANSI窄字节字符串的WriteLog实现

       fprintf接口支持的是ANSI窄字节字符串,封装接口如下:

int WriteLog( char* lpszContent )
{
	if ( lpszContent == NULL )
	{
		return 0;
	}

	char* lpszPath = "D:\\0319.log";
	FILE* pFile = _tfopen( lpszPath, _T("a+") );
	if( NULL == pFile )
	{
		return 0;
	}

	// 获取系统当前时间
	SYSTEMTIME time;
	::GetLocalTime( &time );
    fprintf( pFile, "%04d-%02d-%02d %02d:%02d:%02d:%03d   %s\n", time.wYear, time.wMonth, 
		time.wDay, time.wHour, time.wMinute, time.wSecond, time.wMilliseconds, lpszContent );

	fclose( pFile );

	return 1;
}

3、支持Unicode字符串的WriteLog接口实现

       现在的Windows软件产品一般都需要支持多国语言,所以都要支持全球Unicode统一编码的字符串,所以我们也要提供支持Unicode编码字符串的写日志接口。

       我们要使用Unicode版本的_tfopen_ftprintf等接口去操作日志文件,日志文件中存放的字符也是Unicode字符。如果文件使用Unicode编码,则需要在打开时使用“ab+”模式(二进制模式),并且要写入Unicode编码头:0xff、0xfe

        支持Unicode编码字符串的WriteLog接口实现如下:

int WriteLog( CString strLog )
{
	CString strFilePath = _T("D:\\0328.log");
	BOOL bFileExsit = PathFileExists( strFilePath );

	LPCTSTR pszMode = NULL;
#ifdef _UNICODE
	pszMode = _T("ab+"); // 对于Unicode,要向文件中写入Unicode文字,必须以二进制方式打开
#else
	pszMode = _T("a+");
#endif

	FILE* pFile = NULL;
	int err = _tfopen_s( &pFile, strFilePath, pszMode );
	if( ERROR_SUCCESS != err )
	{
		return 0;
	}

#ifdef _UNICODE
	if ( !bFileExsit )
	{
		// 新创建的日志文件,则写入Unicode头
		BYTE chUnicodeHead[2] = { 0xff, 0xfe }; // Unicode头
		fwrite( chUnicodeHead, sizeof(BYTE), sizeof(chUnicodeHead), pFile );
	}
#endif

	_ftprintf( pFile, _T("%s"), (LPCTSTR)strLog );
	fclose( pFile );
	return 1;
}

你可能感兴趣的:(VC++常用功能代码封装,fopen,fprintf,日志文件)