// ConsoleApplication1.cpp: 定义控制台应用程序的入口点。
//
#pragma once
#include <string>
#include <Windows.h>
#include <stdio.h>
#include "stdafx.h"
#include <stdarg.h>
#include <stdlib.h>
#include <cstring> using namespace std; const char* g_path = "C:\\test.log";
/*
string 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;
}
*/
int myfprintf(const char* pFileName, const char* pFunName, const long lLine, const char* fmt, ...)
{
int ret = ;
//va_list是一个字符串指针,用于获取不确定个数的参数
va_list args;
//读取可变参数的过程其实就是在堆栈中,使用指针,遍历堆栈段中
//的参数列表,从低地址到高地址一个一个的把参数内容读出来的过程
va_start(args, fmt);
//该函数会根据参数fmt字符串来转换格式并格式化数据,然后将结果输出到参数Stream指定的文件中
//直到出现字符串结束的\0为止。
FILE* fp = NULL;
fopen_s(&fp, g_path,"a+");
//string strTime = GetTime();
//fprintf(fp,"%s ", strTime.c_str());
  

    int nFileNameLen = strlen(pFileName);
    char szLine[10] = { 0 };
    sprintf(szLine, "%ld", lLine);
    int nLineLen = strlen(szLine);
    int nSpaceLen = 30 - nFileNameLen - nLineLen;
    for (int i = 0; i<nSpaceLen; ++i)
      fwrite(" ", 1, 1, fp);
    fprintf(fp,"%s:%ld ", pFileName, lLine);

    ret = vfprintf(fp, fmt, args);
printf("%d\n",ret);
//获取完所有参数之后,为了避免发生程序瘫痪,需要将 ap指针关闭,其实这个函数相当于将args设置为NULL
va_end(args);
fflush(fp);
fclose(fp);
return ret;
}
#define LOG(fmt, ...) myfprintf(__FILE__, __FUNCTION__, __LINE__, fmt,##__VA_ARGS__) int main(void)
{
char test1[] = "aaaaaaaaaa";
char* p = test1;
long test2 = ;
long long test3 = ;
LOG("test1 is:%s test2 is:%d test3 is:%lld\n ",p,test2,test3);
LOG("test1 is:%s test2 is:%d test3 is:%lld\n ", p, test2, test3);
getchar();
return ;
}
#include <stdio.h>
#include <stdarg.h> void WriteFrmtd(FILE *stream, char *format, ...)
{
va_list args; va_start(args, format);
vfprintf(stream, format, args);
va_end(args);
}
void WriteFrmtd1(const char* pFileName, const char* pFunName, const long lLine, char *format, ...)
{
FILE* stream = fopen("file1.txt","w"); fprintf(stream,"%s %s %ld ",pFileName,pFunName,lLine); va_list args; va_start(args, format);
vfprintf(stream, format, args);
va_end(args);
} #define LOG(fmt, ...) WriteFrmtd1(__FILE__, __FUNCTION__, __LINE__, fmt,##__VA_ARGS__) int main ()
{
// FILE *fp; // fp = fopen("file.txt","w"); char buff[]; //WriteFrmtd(fp, "This is just one argument %d %s %p\n", 10,"hello",buff);
LOG("This is just one argument %d %s %p\n", ,"hello",buff); // fclose(fp); return();
}

利用可变参数打印log的更多相关文章

  1. 利用可变参数打印log2

    #pragma once #include <string> #include "StdAfx.h" #include <Windows.h> using ...

  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. Redis源码笔记--服务器日志和函数可变参数处理server.c

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

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

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

  9. Java基础——可变参数

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

随机推荐

  1. 阿里图标库使用IconFont

    1.注册账号登陆 2.创建项目 3.搜索想使用的图标,添加入库,或者上传自己的图标入库 4.在图标库中,将添加的图标加入项目 5.将项目图标下载至本地 6.下载文件为 包括三种格式,使用方法不同 Un ...

  2. 【Topcoder 10107】TeamManagement

    Topcoder 10107 题意:给定一棵树,其中有些点是忠诚的,现在要选k个点,每个选择的联通块都必须包含一个忠诚的点,求包含某个点的概率. 思路:考虑树型\(dp\),\(dp(i,j,0/1, ...

  3. java Scanner类的使用

    参考链接:https://blog.csdn.net/android_depon/article/details/69669160     https://www.cnblogs.com/zhengc ...

  4. java Switch中的case后面加上大括号({})和不加大括号的区别

    java基础求真之switch 的case 后面加上大括号和不加大括号的区别. 下面给出三段代码大家看一下有什么不同以及哪段代码能够编译通过那段代码编译不能通过,为什么?(Why?) 代码片段一: i ...

  5. Luogu4768 NOI2018 归程 最短路、Kruskal重构树

    传送门 题意:给出一个$N$个点.$M$条边的图,每条边有长度和海拔,$Q$组询问,每一次询问从$v$开始,经过海拔超过$p$的边所能到达的所有点中到点$1$的最短路的最小值,强制在线.$N \leq ...

  6. 转:判断js中的数据类型的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  7. Centos7 64位 -- glibc-2.29 编译升级方法(已成功)

    某软件出现漏洞,需要升级解决(忘了哪个)结果提示glibc版本过低. 懵懂无知的我以为glibc想其他软件一样编译升级一下就好.. 结果? 重装系统! 说真的,如非必要(或学习),请勿升级 glibc ...

  8. JavaScript 利用 async await 实现 sleep 效果

    const sleep = (timeountMS) => new Promise((resolve) => { setTimeout(resolve, timeountMS); }); ...

  9. Mysql抓包工具 - MySQL Sniffer 使用小结 (含带general_log日志)

    在mysql运维工作中,一般会使用tcpdump做一些分析(直接读分析日志比较难以看明白,在数据库连接值高时使用):对于mysql实时的连接监控分析,通常会使用"mysqladmin/sho ...

  10. Mysql基于GTID复制模式-运维小结 (完整篇)

    先来看mysql5.6主从同步操作时遇到的一个报错:mysql> change master to master_host='192.168.10.59',master_user='repli' ...