#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的更多相关文章

  1. 利用可变参数打印log

    // ConsoleApplication1.cpp: 定义控制台应用程序的入口点. // #pragma once #include <string> #include <Wind ...

  2. C利用可变参数列表统计一组数的平均值,利用函数形式参数栈原理实现指针运算

    //描述:利用可变参数列表统计一组数的平均值 #include <stdarg.h> #include <stdio.h> float average(int num, ... ...

  3. _vsnprintf在可变参数打印中的用法

    _vsnprintf,C语言库函数之一,属于可变参数.用于向字符串中打印数据.数据格式用户自定义. 函数简介 编辑 头文件: #include <stdarg.h> 函数声明: int _ ...

  4. 利用可变参数模拟Printf()函数实现一个my_print()函数和调用可变参数注意的陷阱!

    可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 例如,对于函数: void test(char a ...

  5. Linux可变参数打印日志(二)

    #include<stdio.h> #include<stdlib.h> #include<stdarg.h> #include<string.h> # ...

  6. Linux 打印可变参数日志

    实现了传输进去的字符串所在的文档,函数和行数显示功能. 实现了将传入的可变参数打印到日志功能. #include<stdio.h> #include<stdarg.h> #in ...

  7. 【C语言】模拟实现printf函数(可变参数)

    一.printf函数介绍 printf功能 printf函数是格式化输出函数,一般用于向标准输出设备按规定格式输出信息. printf原型 int printf( const char* format ...

  8. Java基础——可变参数

    大家都知道main方法的参数就是一个数组类型的,那么它其实也是可以改成不定参数类型.我试了试,并调用了一些弹出来的方法. public class ClassC2 { public static vo ...

  9. Redis源码笔记--服务器日志和函数可变参数处理server.c

    前言 Redis源码中定义了几个和日志相关的函数,用于将不同级别的信息打印到不同的位置(日志文件或标准输出,取决于配置文件的设置),这些函数的定义位于 server.h 和server.c 文件中,包 ...

随机推荐

  1. *** Collection <__NSArrayM: 0x600000647380> was mutated while being enumerated.

    *** Collection <__NSArrayM: 0x600000647380> was mutated while being enumerated.

  2. linxu系统知识和简单命令

    Linux目录基本知识 / 根目录 /bin 存放必要的命令 (binary) /boot 存放内核以及启动所需的文件(引导/自引/启动/开机程序) /dev 存放设备文件 (devices) /et ...

  3. java中使用阻塞队列实现生产这与消费这之间的关系

    需求如下: 有一个生产者和一个消费者,生产者不断的生产产品,消费这不断的消费产品.产品总数为N. 1.生产顺序按队列的方式,先进先出. 2.生产者和消费这可以同时进行. 3.当生产者生产了N个产品后不 ...

  4. B Long Path

    有n+1个房间.从1-n个房间.每个房间有两扇门.一扇去i+1的房间另一扇去编号为pi的房间. 起点为1,终点为n+1,对应第i个各点,如果我奇数次到达,那么下一步走到a[i]的位子,如果是偶数次到达 ...

  5. 汇编 OD 标志位 置位相关指令

    知识点: l 标志位 置位相关指令   l 标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW)    标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志. ...

  6. SDP服务搜索流程源码分析

    BREDR的设备 在进行配对完成之后,进行;连接之前都要进行服务的搜索,服务搜索走的流程是SDP,这篇文章就分析一下,bluedroid中SDP的代码流程,我们从配对完成的回调函数开始分析: /*** ...

  7. Windows 窗体中的事件顺序

    来自:https://docs.microsoft.com/zh-cn/dotnet/framework/winforms/order-of-events-in-windows-forms 对于依次处 ...

  8. [UWP 自定义控件]了解模板化控件(2.1):理解ContentControl

    UWP的UI主要由布局容器和内容控件(ContentControl)组成.布局容器是指Grid.StackPanel等继承自Panel,可以拥有多个子元素的类.与此相对,ContentControl则 ...

  9. 2018年高教社杯全国大学生数学建模竞赛B题解题思路

    题目 先贴下B题的题目吧 问题B    智能RGV的动态调度策略 图1是一个智能加工系统的示意图,由8台计算机数控机床(Computer Number Controller,CNC).1辆轨道式自动引 ...

  10. Node 系列之url模块

    引入 url: const url = require("url"); 用于URL解析.处理等操作的解决方案 1.url.parse(urlStr[, parseQueryStri ...