利用可变参数打印log2
#pragma once
#include <string>
#include "StdAfx.h"
#include <Windows.h>
using std::string;
using std::wstring;
const char* g_pLogPath = "C:\\TestLog.log";
#define LOG_ENABLE //打印日志启用开关 class CSimpleLog
{
public:
CSimpleLog(void);
~CSimpleLog(void);
void Write(const char* pSourcePath, const char* pFunName, const long lLine, const char* pLogText);
void Write(const char* pSourcePath, const char* pFunName, const long lLine, const wchar_t* pLogText);
void ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const char* pLogText, ...);
void ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const wchar_t* pLogText, ...);
protected:
string GetTime();
string U2A(const wstring& str);
}; CSimpleLog g_log;
CSimpleLog::CSimpleLog(void)
{
} CSimpleLog::~CSimpleLog(void)
{
} void CSimpleLog::Write(const char* pSourcePath, const char* pFunName, \
const long lLine, const char* pLogText)
{
if (pLogText == NULL)
return;
int nLogLen = strlen(pLogText);
if (nLogLen == 0)
return;
int nSourceLen = strlen(pSourcePath);
int nFunLen = strlen(pFunName);
char szLine[10] = { 0 };
sprintf_s(szLine, "%ld", lLine);
int nLineLen = strlen(szLine);
int nSpaceLen = 80 - nSourceLen - nFunLen - nLineLen;
string strTime = GetTime();
FILE* fp = NULL;
fopen_s(&fp, g_pLogPath, "a+");
fwrite(strTime.c_str(), strTime.size(), 1, fp);
fwrite(" ", 1, 1, fp);
fwrite(pSourcePath, nSourceLen, 1, fp);
for (int i = 0; i<nSpaceLen; ++i)
fwrite(" ", 1, 1, fp);
fwrite(pFunName, nFunLen, 1, fp);
fwrite(" ", 1, 1, fp);
fwrite(szLine, nLineLen, 1, fp);
fwrite(": ", 2, 1, fp);
fwrite(pLogText, nLogLen, 1, fp);
fwrite("\n", 1, 1, fp);
fclose(fp);
} void CSimpleLog::Write(const char* pSourcePath, const char* pFunName, const long lLine, const wchar_t* pLogText)
{
string strLogText = U2A(pLogText);
Write(pSourcePath, pFunName, lLine, strLogText.c_str());
} string CSimpleLog::GetTime()
{
SYSTEMTIME st;
::GetLocalTime(&st);
char szTime[26] = { 0 };
sprintf_s(szTime, "%04d-%02d-%02d %02d:%02d:%02d %d ", st.wYear, st.wMonth, st.wDay, st.wHour, \
st.wMinute, st.wSecond, st.wMilliseconds);
return szTime;
} string CSimpleLog::U2A(const wstring& str)
{
string strDes;
if (str.empty())
return strDes;
int nLen = ::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), NULL, 0, NULL, NULL);
if (0 == nLen)
return strDes;
char* pBuffer = new char[nLen + 1];
memset(pBuffer, 0, nLen + 1);
::WideCharToMultiByte(CP_ACP, 0, str.c_str(), str.size(), pBuffer, nLen, NULL, NULL);
pBuffer[nLen] = '\0';
strDes.append(pBuffer);
delete[] pBuffer;
__end:
return strDes;
} void CSimpleLog::ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const char* pLogText, ...)
{
va_list pArgs;
va_start(pArgs, pLogText);
char szBuffer[1024] = { 0 };
_vsnprintf_s(szBuffer, 1024, pLogText, pArgs);
va_end(pArgs);
Write(pSourcePath, pFunName, lLine, szBuffer);
} void CSimpleLog::ScanfWrite(const char* pSourcePath, const char* pFunName, const long lLine, \
const wchar_t* pLogText, ...)
{
va_list pArgs;
va_start(pArgs, pLogText);
wchar_t szBuffer[1024] = { 0 };
_vsnwprintf_s(szBuffer, 1024, pLogText, pArgs);
va_end(pArgs);
Write(pSourcePath, pFunName, lLine, szBuffer);
} #ifdef LOG_ENABLE
#define SL_LOG(x) g_log.Write(__FILE__, __FUNCTION__, __LINE__, x)
#define SL_LOG1(x, p1) <span style="white-space:pre"> </span>g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1)
#define SL_LOG2(x, p1, p2) <span style="white-space:pre"> </span>g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1, p2)
#define SL_LOG3(x, p1, p2, p3) <span style="white-space:pre"> </span>g_log.ScanfWrite(__FILE__, __FUNCTION__, __LINE__, x, p1, p2, p3)
#else
#define SL_LOG(x)
#define SL_LOG1(x, p1)
#define SL_LOG2(x, p1, p2)
#define SL_LOG3(x, p1, p2, p3)
#endif
利用可变参数打印log2的更多相关文章
- 利用可变参数打印log
// ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #pragma once #include <string> #include <Wind ...
- C利用可变参数列表统计一组数的平均值,利用函数形式参数栈原理实现指针运算
//描述:利用可变参数列表统计一组数的平均值 #include <stdarg.h> #include <stdio.h> float average(int num, ... ...
- _vsnprintf在可变参数打印中的用法
_vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...
- 利用可变参数模拟Printf()函数实现一个my_print()函数和调用可变参数注意的陷阱!
可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 例如,对于函数: void test(char a ...
- Linux可变参数打印日志(二)
#include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<string.h> # ...
- Linux 打印可变参数日志
实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...
- 【C语言】模拟实现printf函数(可变参数)
一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format ...
- Java基础——可变参数
大家都知道main方法的参数就是一个数组类型的,那么它其实也是可以改成不定参数类型.我试了试,并调用了一些弹出来的方法. public class ClassC2 { public static vo ...
- Redis源码笔记--服务器日志和函数可变参数处理server.c
前言 Redis源码中定义了几个和日志相关的函数,用于将不同级别的信息打印到不同的位置(日志文件或标准输出,取决于配置文件的设置),这些函数的定义位于 server.h 和server.c 文件中,包 ...
随机推荐
- AI 概率论
概率论 不确定性 量化 频率 频率派 贝叶斯派 1.随机变量(random variable) 随机取不同值的变量,取值可以离散或者连续. 2.概率分布(probability distributio ...
- java 面向对象基本知识
1.继承 使用extends实现继承 只有单继承 子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法). instanceof是二元 ...
- supervisor 结合 Dockerfile ENTRYPOINT
通过docker run -d 方式启动容器报“Unlinking stale socket /tmp/supervisor.sock”错误,而通过docker run -it 启动后手动执行 /u ...
- Excel 2007 底层实现方式
一.EXCEL的底层实现 能力有限,了解的比较浅,有不足之处望指正,首先看下图: 一. excel2007是使用xml格式来存储的,把一个excel文件后缀改为.zip,打开之后就直接可以看到一个ex ...
- ARM的9种寻址方式
立即寻址 操作数是立即数,以“#”为前缀,表示 16 进制数值时以“0x”表示. 例: MOV R0,#0xFF00 ;0xFF00 -> R0 SUBS R0,R0,#1 ...
- SPOJ Qtree系列 5/7
Qtree1 树剖裸题 注意把边权移到深度较深的点上,树剖跳的时候不要将LCA的答案统计上就行了 #include<stdio.h> #include<string.h> #d ...
- vue + element 实现登录注册(自定义表单验证规则)
注册页包含手机验证码登录和密码的二次验证. 效果如下: 实现代码: <template> <div> <div class="register-wrapper& ...
- Flutter - TabBar导航栏切换后,状态丢失
上一篇讲到了 Flutter - BottomNavigationBar底部导航栏切换后,状态丢失 里面提到了TabBar,这儿专门再写一下吧,具体怎么操作,来不让TabBar的状态丢失.毕竟大家99 ...
- [UWP 自定义控件]了解模板化控件(5.2):UserControl vs. TemplatedControl
1. UserControl vs. TemplatedControl 在UWP中自定义控件常常会遇到这个问题:使用UserControl还是TemplatedControl来自定义控件. 1.1 使 ...
- 1023 C. Bracket Subsequence
传送门 [http://codeforces.com/contest/1023/problem/C] 题意 n字符串长度,k要求的字符串的长度,字符串只包含'('和')',而且这两种的数量相等,要求的 ...