封装通常是指芯片的封装,指规定的引脚数目和定义
C语言没有明确的封装定义
不过在做工程项目时,经常会有这个概念,说没有封装概念的人可能没这方面的经验
比如嵌入式系统开发,会用到不同供应商的设备和驱动,可能功能都类似,但是代码形式千差万别,为直观和开发方便起见,就必须对这些驱动按照统一的格式来重新封装
用C语言的时候,您是否还在使用printf函数来输出日志呢?您是否考虑过将printf函数打印的内容存到文件中去呢?您是否想拥有一个可选择的既支持输出到屏幕又支持存储到文件中的日志函数呢?很高兴的告诉您,如果您愿意的话,欢迎使
第一段:定义宏变量BUF_SIZE
view plaincopy to clipboardprint?
第二段:定义log_st结构体
typedef struct _log_st log_st;
struct _log_st
{
int fd;
int size; 非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!
用C语言的时候,您是否还在使用printf函数来输出日志呢?您是否考虑过将printf函数打印的内容存到文件中去呢?您是否想拥有一个可选择的既支持输出到屏幕又支持存储到文件中的日志函数呢?很高兴的告诉您,如果您愿意的话,欢迎使用本人编写的一个一套日志函数,该套函数由五部分组成,分别是宏变量BUF_SIZE、结构体log_st、log_init函数、log_debug函数和log_checksize函数.其中宏变量BUF_SIZE用来限制每次输出的日志的最大长度;结构体用来存储用户需求,包括文件路径、文件描述符号、单个文件最大大小、输出方式标志、文件命名标志等;log_init函数用来完成用户需求录入、文件创建等功能,在mian函数的开始调用一次即可;log_debug函数的功能跟printf很类似,是在printf基础上进行的扩充,实现将日志输出到屏幕或者写入到文件,在需要打印日志的地方调用该函数;log_checksize函数用来检测日志文件大小是否超过最大大小限制,它需要您定时或者定点调用它,如果一直不调用,则日志文件将不受指定的最大大小限制.
typedef?struct?_log_st?log_st;
struct?_log_st
int?fd;
int?size;
int?level;
int?num;
};
第三段:定义log_init函数
log_st?*log_init(char?*path,?int?size,?int?level,?int?num)
if?(NULL?==?path?||?0?==?level)?return?NULL;
log_st?*log?=?(log_st?*)malloc(sizeof(log_st));
memset(log,?0,?sizeof(log_st));
//the?num?use?to?control?file?naming
log-num?=?num;
if(num)
else
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;
}
log-size?=?(size?0?size:0);
log-level?=?(level?0?level:0);
return?log;
第四段:定义log_debug函数
void?log_debug(log_st?*log,?const?char?*msg,?...)
va_list?ap;
time_t?now;
char?*pos;
char?_n?=?'\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;
printf("%s\n",?message);
return;
write(log-fd,?message,?strlen(message));
write(log-fd,?_n,?1);
fsync(log-fd);
第五段:定义log_checksize函数
void?log_checksize(log_st?*log)
struct?stat?stat_buf;
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)
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);
以上就是土嘎嘎小编为大家整理的C语言日志函数封装相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!