永发信息网

C语言怎么封装自己写的函数

答案:1  悬赏:0  手机版
解决时间 2021-03-26 18:07
C语言怎么封装自己写的函数
最佳答案
用C语言的时候,您是否还在使用printf函数来输出日志呢?您是否考虑过将printf函数打印的内容存到文件中去呢?您是否想拥有一个可选择的既支持输出到屏幕又支持存储到文件中的日志函数呢?很高兴的告诉您,如果您愿意的话,欢迎使用本人编写的一个一套日志函数,该套函数由五部分组成,分别是宏变量BUF_SIZE、结构体log_st、log_init函数、log_debug函数和log_checksize函数。其中宏变量BUF_SIZE用来限制每次输出的日志的最大长度;结构体用来存储用户需求,包括文件路径、文件描述符号、单个文件最大大小、输出方式标志、文件命名标志等;log_init函数用来完成用户需求录入、文件创建等功能,在mian函数的开始调用一次即可;log_debug函数的功能跟printf很类似,是在printf基础上进行的扩充,实现将日志输出到屏幕或者写入到文件,在需要打印日志的地方调用该函数;log_checksize函数用来检测日志文件大小是否超过最大大小限制,它需要您定时或者定点调用它,如果一直不调用,则日志文件将不受指定的最大大小限制。
一、定义宏变量BUF_SIZE
view plaincopy to clipboardprint?
#define BUF_SIZE 1024  
二、定义log_st结构体
view plaincopy to clipboardprint?
typedef struct _log_st log_st;  
struct _log_st  
{  
    char path[128];  
    int fd;  
    int size;  
    int level;  
    int num;  
};  
三、定义log_init函数
参数说明:path——您要存储的文件路径;size——单个文件的最大大小,如果超过该大小则新建新的文件用来存储;level——日志输出方式,建议在上层限制其值的范围为0到3,0表示日志既不输出到屏幕也不创建文件和保存到文件,1表示日志保存到文件但不输出到屏幕,2表示日志既输出到屏幕也保存到文件,3表示日志只输出到文件而不创建文件和存入文件;num——日志文件命名方式,非0表示以(int)time(NULL)作为文件名来保存文件,文件数量随着日志量的递增而递增;0表示以“.new”和“.bak”为文件名来保存文件,文件数量不超过两个,随着日志量的递增,旧的日志文件将被新的覆盖,更直观的说就是说.new”和“.bak”文件只保存最近的日志。
view plaincopy to clipboardprint?
log_st *log_init(char *path, int size, int level, int num)  
{  
    char new_path[128] = {0};  
    if (NULL == path || 0 == level) return NULL;  
    log_st *log = (log_st *)malloc(sizeof(log_st));  
    memset(log, 0, sizeof(log_st));  
    if (level != 3)  
    {  
        //the num use to control file naming  
        log->num = num;  
        if(num)  
            snprintf(new_path, 128, "%s%d", path, (int)time(NULL));  
        else  
            snprintf(new_path, 128, "%s.new", path);  
        if(-1 == (log->fd = open(new_path, O_RDWR|O_APPEND|O_CREAT|O_SYNC, S_IRUSR|S_IWUSR|S_IROTH)))  
        {  
            free(log);  
            log = NULL;  
            return NULL;  
        }  
    }  
    strncpy(log->path, path, 128);  
    log->size = (size > 0 ? size:0);  
    log->level = (level > 0 ? level:0);  
    return log;  
}  
四、定义log_debug函数
view plaincopy to clipboardprint?
void log_debug(log_st *log, const char *msg, ...)  
{  
    va_list ap;  
    time_t now;  
    char *pos;  

    char _n = '
';      char message[BUF_SIZE] = {0};  
    int nMessageLen = 0;  
    int sz;  
    if(NULL == log || 0 == log->level) return;  
    now = time(NULL);  
    pos = ctime(&now);  
    sz = strlen(pos);  
    pos[sz-1]=']';  
    snprintf(message, BUF_SIZE, "[%s ", pos);  
    for (pos = message; *pos; pos++);  
    sz = pos - message;  
    va_start(ap, msg);  
    nMessageLen = vsnprintf(pos, BUF_SIZE - sz, msg, ap);  
    va_end(ap);  
    if (nMessageLen <= 0) return;  
    if (3 == log->level)  
    {  

        printf("%s
", message);          return;  
    }  
    if (2 == log->level)  

        printf("%s
", message);      write(log->fd, message, strlen(message));  
    write(log->fd, &_n, 1);  
    fsync(log->fd);  
}  
五、定义log_checksize函数
view plaincopy to clipboardprint?
void log_checksize(log_st *log)  
{  
    struct stat stat_buf;  
    char new_path[128] = {0};  
    char bak_path[128] = {0};  
    if(NULL == log || 3 == log->level || '' == log->path[0]) return;  
    memset(&stat_buf, 0, sizeof(struct stat));  
    fstat(log->fd, &stat_buf);  
    if(stat_buf.st_size > log->size)  
    {  
        close(log->fd);  
        if(log->num)  
            snprintf(new_path, 128, "%s%d", log->path, (int)time(NULL));  
        else  
        {  
            snprintf(bak_path, 128, "%s.bak", log->path);  
            snprintf(new_path, 128, "%s.new", log->path);  
            remove(bak_path); //delete the file *.bak first  
            rename(new_path, bak_path); //change the name of the file *.new to *.bak  
        }  
        //create a new file  
        log->fd = open(new_path, O_RDWR|O_APPEND|O_CREAT|O_SYNC, S_IRUSR|S_IWUSR|S_IROTH);  
    }  
}  


我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
合同去哪公证
沪州古酒38度洞藏6年多少钱一瓶?
PROE颜色如何保存?
求一首歌 婚礼上听见的 高潮部分是 oh baby ~
意、义、亿、易、益、毅、亦、怡、逸、懿、艺
如果将一个完整的经济周期分为扩张和收缩两个
亲谁有包饺子的花样方法不?
第24题是???在线等急!
操场的面积约是2500( )
孝庄秘史的主题曲伴奏曲
晨光幼儿园(南天门华侨城西北)地址在什么地方
SMT上错料该怎么培训
请问已经暧昧上了床的关系,我该怎么和男方转
网络监控摄像头的IP怎么查看和修改?
做酱菜的生抽能重复使用吗
推荐资讯
数学问题!!!!x1、x2是一元二次方程4kx平
下部贯通筋和下部钢筋的区别?
我和詹群没结婚报警不接
ZX7-200焊机是多少瓦的
地方植物名称
苹果4s怎么更新ios8系统
这是什么斑
我想写一段带名字的情话
IRFPE40和IRFPG40可否直接代换。
假牙做活动假牙好还是做固定牙齿好
婚礼答谢宴酒桌上,自己可以当主陪吗
认识我的人都说我心肠好,但是做人、说话很直
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?