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

Posted dvlinker

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++使用fprintf函数实现写日志文件的功能(附源码)相关的知识,希望对你有一定的参考价值。

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

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++使用fprintf函数实现写日志文件的功能(附源码)的主要内容,如果未能解决你的问题,请参考以下文章

VC++获取文件的修改时间,定期清理若干天之前的日志文件(附源码)

fprintf中使用stderr

fprintf中使用stderr

C语言 fprintf 往文件中写格式化数据

C语言fputs fgets fputc fgetc fscanf fprintf及fopen操作的整理

使用 fprintf 调试调用 C DLL 的 MFC 程序