C语言可变参数日志函数

可变参数的C函数:

写可变参数的C函数要在程序中用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); va在这里是variable-argument(可变参数)的意思. 这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个 头文件.下面我们写一个简单的可变参数的函数,改函数至少有一个整数 参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值. #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <stdarg.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/syslog.h> #include <errno.h> #define LOG_FILE_NAME         "log.txt" #define LOG_MAX_BAK_SIZE       8192*1024     /* 错误记录文件的最大容量 */   int get_file_size(char *filename)  /*定义一个用来获取文件大小的函数*/ {     struct stat buf;     if(stat(filename, &buf)<0)     {         return 0;     }     return buf.st_size; } int writelog(int nLogLevel,char *pcFormat,...) {     char  szBuf[16];         char  szRename[256];         int iRc=0;         memset(szBuf,0,sizeof(szBuf));         memset(szRename,0,sizeof(szRename));         time_t now;         now=time(NULL);         struct tm *tp;         tp =localtime(&now);         int iFileSize =0;         FILE *fp =NULL;         fp=fopen(LOG_FILE_NAME,"a+");         if(fp==NULL)           {              perror("open logfile");              exit(1);           }         chmod(LOG_FILE_NAME, 0755);//修改日志文件权限         iFileSize= get_file_size(LOG_FILE_NAME);         if (nLogLevel ==LOG_INFO ) {         strcpy(szBuf,"<INFO:");     }else if(nLogLevel==LOG_WARNING){         strcpy(szBuf,"<WARN:");     }else if(nLogLevel==LOG_ERR){         strcpy(szBuf,"<ERR: ");     }else{         strcpy(szBuf,"~~~~~");     }         fprintf(fp,"%s %02d:%02d:%02d>",szBuf,tp->tm_hour,tp->tm_min,tp->tm_sec);         va_list  argptr;         va_start(argptr,pcFormat);     vfprintf(fp,pcFormat,argptr);     va_end(argptr);                                   if (iFileSize >= LOG_MAX_BAK_SIZE)              {              sprintf(szRename,"%s.(%02d:%02d:%02d)",LOG_FILE_NAME,tp->tm_hour,tp->tm_min,tp->tm_sec);         if ((iRc = rename(LOG_FILE_NAME, szRename)) != 0)                 {             printf("fatal error occured ! iRc= %d error_no is %d\n",                    iRc,errno);             printf("writelog: %s CANNOT BE RENAMED !\n",LOG_FILE_NAME);             return(-1);         }             }         fclose(fp);         fp=NULL;          return(0); }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值