18、通过可变参数实现打印日志

cc++中,可变参数使用的最多函数有:scanfprintf,以及fprintffscanfsprintf等,MFC也提供CString::Format实现可变参数。

本示例通过va_list来实现自己的可变参数函数,实现程序写日志功能。
18、通过可变参数实现打印日志18、通过可变参数实现打印日志通过可变参数实现日志打印//ForATest.cpp : 定义控制台应用程序的入口点。

#include"stdafx.h"

#include
"Windows.h"

#include
"iostream"

usingnamespacestd;

#include
"string"

#include
<stdio.h>

#include
<stdarg.h>

#definePL_ERROR -2

#defineSERVICE_ERROR(strMod, ulErrCode, cFormat, ...)

logRecord(FUNCTION, LINE, strMod, PL_ERROR, ulErrCode, cFormat, VA_ARGS);

staticstringTestIT_MODULE="TestItMe";

voidlogRecord(stringstrFunc,

intiLine,

stringstrMod,

intiLevel,

intiErrCode,

charcFormat,

...)

{

stringstrLog;

strLog.clear();

characBuffer1[255], acBuffer2[255];

sprintf_s(acBuffer1,
254,"[%s] [%d] [%s] [%d] [%d]", strFunc.data(), iLine, strMod.data(), iLevel, iErrCode);

va_list args;

va_start (args, cFormat);

vsprintf(acBuffer2,cFormat, args);

FILE
pFile=fopen("C:\log.txt","a+");

if(NULL==pFile)

return;

fprintf(pFile, acBuffer1);

fprintf(pFile, acBuffer2);

fprintf(pFile,
"n");

fclose(pFile);

va_end(args);

}

int_tmain(intargc, _TCHAR*argv[])

{

stringstrFileName="C:\Intel\Logs";

SERVICE_ERROR(TestIT_MODULE,
-1,"GetFile %s Attributes fail error code %d", strFileName.data(), GetLastError());

}
18、通过可变参数实现打印日志18、通过可变参数实现打印日志sprintf_s的一个示例#include<stdio.h>

#include
"string"

#include
"iostream"

usingnamespacestd;

intmain(void)

{

charbuffer[200], s[]="computer", c='l';

inti=35, j;

floatfp=1.7320534f;

stringname="hello";

//Format and print various data:

j=sprintf_s( buffer,200,"String: %sn", s );

j
+=sprintf_s( buffer+j,200-j,"Character: %cn", c );

j
+=sprintf_s( buffer+j,200-j,"Integer: %dn", i );

j
+=sprintf_s( buffer+j,200-j,"Real: %fn", fp );

j
+=sprintf_s( buffer+j,200-j,"Name: %sn", name.data() );

printf_s(
"Output:n%sncharacter count = %dn", buffer, j );

}
18、通过可变参数实现打印日志18、通过可变参数实现打印日志C++ version

// AssistTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "cstdio"#include "iostream"#include "string"#include "fstream"#include "cstdarg"#include "windows.h"using namespace std;const int OP_SUCCESS = 0;const int OP_FAILED = -1;static string TestIT_MODULE = "TestItMe";#define SERVICE_ERROR(strMod, ulErrCode, cFormat, ...)     logRecord(__FUNCTION__, __LINE__, strMod, ulErrCode, cFormat, __VA_ARGS__);//print log modulevoid logRecord(string strFunc,               int iLine,               string strMod,               int iErrCode,               char* cFormat,               ...){    string strLog;    strLog.clear();    char acBuffer1[255], acBuffer2[255];    sprintf_s(acBuffer1, 254, "[%s] [%d] [%s] [%d] ", strFunc.data(), iLine, strMod.data(), iErrCode);    va_list args;    va_start (args, cFormat);    vsprintf(acBuffer2,cFormat, args);    ofstream ofLogFile;    ofLogFile.open("F:\log.txt", ios::out | ios::app);    if (!ofLogFile)    {        return;    }    string strBuffer1, strBuffer2;    strBuffer1 = acBuffer1;    strBuffer2 = acBuffer2;    ofLogFile.write(strBuffer1.data(), strBuffer1.size());    ofLogFile.write(strBuffer2.data(), strBuffer2.size());    ofLogFile.put('n');    ofLogFile.close();    va_end(args);}int main(int argc, char* argv[]){    string strFileName = "C:\Intel\Logs";    SERVICE_ERROR(TestIT_MODULE, -1, "GetFile %s Attributes fail error code %d", strFileName.data(), GetLastError());}

18、通过可变参数实现打印日志18、通过可变参数实现打印日志C++ version 2

// AssistTest.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "cstdio"#include "iostream"#include "string"#include "fstream"#include "cstdarg"#include "windows.h"using namespace std;const int OP_SUCCESS = 0;const int OP_FAILED = -1;static string TestIT_MODULE = "TestItMe";class mt{public:    void LogRecord(string strFunc, unsigned int uiLine, string strMod, int iulErrCode, char* cFormat, ...);    //print log module};void mt::LogRecord(string strFunc,                   unsigned int uiLine,                   string strMod,                   int iErrCode,                   char* cFormat,                   ...){    string strLog;    strLog.clear();    char acBuffer1[255], acBuffer2[255];    sprintf_s(acBuffer1, 254, "[%s] [%d] [%s] [%d] ", strFunc.data(), uiLine, strMod.data(), iErrCode);    va_list args;    va_start (args, cFormat);    vsprintf(acBuffer2,cFormat, args);    ofstream ofLogFile;    ofLogFile.open("F:\log.txt", ios::out | ios::app);    if (!ofLogFile)    {        return;    }    string strBuffer1, strBuffer2;    strBuffer1 = acBuffer1;    strBuffer2 = acBuffer2;    ofLogFile.write(strBuffer1.data(), strBuffer1.size());    ofLogFile.write(strBuffer2.data(), strBuffer2.size());    ofLogFile.put('n');    ofLogFile.close();    va_end(args);}int main(int argc, char* argv[]){    string strFileName = "C:\Intel\Logs";    mt m1;    m1.LogRecord(__FUNCTION__, __LINE__ ,TestIT_MODULE, -1, "GetFile %s Attributes fail error code %d", strFileName.data(), GetLastError());}

参考

[1] http://www.cplusplus.com/reference/clibrary/cstdio/vsprintf/

[2] http://www.cnblogs.com/stuarts/archive/2010/08/03/1791598.html

[3] http://www.cnblogs.com/mydomain/archive/2010/07/27/1785667.html

讲述了了va_start等可变参数的基本概念及定义
原文链接: https://www.cnblogs.com/mydomain/archive/2010/12/06/1898140.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/18375

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午7:11
下一篇 2023年2月7日 下午7:11

相关推荐