用C語言的時候,您是否還在使用printf函數(shù)來輸出日志呢?您是否考慮過將printf函數(shù)打印的內(nèi)容存到文件中去呢?您是否想擁有一個可選擇的既支持輸出到屏幕又支持存儲到文件中的日志函數(shù)呢?很高興的告訴您,如果您愿意的話,歡迎使用本人編寫的一個一套日志函數(shù),該套函數(shù)由五部分組成,分別是宏變量BUF_SIZE、結(jié)構(gòu)體log_st、log_init函數(shù)、log_debug函數(shù)和log_checksize函數(shù)。其中宏變量BUF_SIZE用來限制每次輸出的日志的最大長度;結(jié)構(gòu)體用來存儲用戶需求,包括文件路徑、文件描述符號、單個文件最大大小、輸出方式標(biāo)志、文件命名標(biāo)志等;log_init函數(shù)用來完成用戶需求錄入、文件創(chuàng)建等功能,在mian函數(shù)的開始調(diào)用一次即可;log_debug函數(shù)的功能跟printf很類似,是在printf基礎(chǔ)上進(jìn)行的擴充,實現(xiàn)將日志輸出到屏幕或者寫入到文件,在需要打印日志的地方調(diào)用該函數(shù);log_checksize函數(shù)用來檢測日志文件大小是否超過最大大小限制,它需要您定時或者定點調(diào)用它,如果一直不調(diào)用,則日志文件將不受指定的最大大小限制。

成都創(chuàng)新互聯(lián)公司致力于成都做網(wǎng)站、網(wǎng)站設(shè)計,成都網(wǎng)站設(shè)計,集團網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇成都創(chuàng)新互聯(lián)公司,就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!
一、定義宏變量BUF_SIZE
view plaincopy to clipboardprint?
#define?BUF_SIZE?1024
二、定義log_st結(jié)構(gòu)體
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函數(shù)
參數(shù)說明:path——您要存儲的文件路徑;size——單個文件的最大大小,如果超過該大小則新建新的文件用來存儲;level——日志輸出方式,建議在上層限制其值的范圍為0到3,0表示日志既不輸出到屏幕也不創(chuàng)建文件和保存到文件,1表示日志保存到文件但不輸出到屏幕,2表示日志既輸出到屏幕也保存到文件,3表示日志只輸出到文件而不創(chuàng)建文件和存入文件;num——日志文件命名方式,非0表示以(int)time(NULL)作為文件名來保存文件,文件數(shù)量隨著日志量的遞增而遞增;0表示以“.new”和“.bak”為文件名來保存文件,文件數(shù)量不超過兩個,隨著日志量的遞增,舊的日志文件將被新的覆蓋,更直觀的說就是說.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函數(shù)
view plaincopy to clipboardprint?
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;
if?(3?==?log-level)
{
printf("%s\n",?message);
return;
}
if?(2?==?log-level)
printf("%s\n",?message);
write(log-fd,?message,?strlen(message));
write(log-fd,?_n,?1);
fsync(log-fd);
}
五、定義log_checksize函數(shù)
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?||?'\0'?==?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);
}
}
您好,對于你的遇到的問題,我很高興能為你提供幫助,我之前也遇到過喲,以下是我的個人看法,希望能幫助到你,若有錯誤,還望見諒!。展開全部
用C語言的時候,您是否還在使用printf函數(shù)來輸出日志呢?您是否考慮過將printf函數(shù)打印的內(nèi)容存到文件中去呢?您是否想擁有一個可選擇的既支持輸出到屏幕又支持存儲到文件中的日志函數(shù)呢?很高興的告訴您,如果您愿意的話,歡迎使
一、定義宏變量BUF_SIZE
view plaincopy to clipboardprint?
#define BUF_SIZE 1024
二、定義log_st結(jié)構(gòu)體
view plaincopy to clipboardprint?
typedef struct _log_st log_st;
struct _log_st
{
char path[128];
int fd;
int size; 非常感謝您的耐心觀看,如有幫助請采納,祝生活愉快!謝謝!
各種用
C
語言實現(xiàn)的模板可能在使用形式上有所不同。現(xiàn)以一個求和函數(shù)
Sum
為例,用
C++
Template
可寫如下:
template
R
Sum(const
T
*array,
int
n)
{
R
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
sum
+=
i;
return
sum;
}
如果不是內(nèi)置類型,該模板隱式地需要
有R
R::operator+=(T)運算符可用。
1.
使用函數(shù)指針作為
Functor
替換者
Typedef
struct
tagAddClass
{
Void
(*add)(char*
r1,
const
char*
r2);
Int
elemSize;
Char
sum[MAX_ELEM_SIZE];
}
AddClass;
void
Sum(AddClass*
self,
const
char*
array,
int
n)
{
for
(int
i
=
;
i
n
;
++i)
self-add(self-sum,
array
+
i*self-elemSize);
}
使用時:
Void
AddInt(char*
r1,
const
char*
r2)
{
*(long*)r1
+=
*(int*)r2;
}
AddClass
addClass
=
{AddInt,
2,
};
Int
array[100];
Read(array);
Sum(addClass,
array,
100);
…..
2.
用宏作為Functor的替換者
#define
GenSumFun(SumFunName,
Add,
RetType,
ElemType)
RetType
SumFunName
(const
ElemType
*array,
int
n)
\
{
RetType
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
Add(sum,
i);
return
sum;
}
使用時:
#define
AddInt(x,
y)
((x)
+=
(y))
GenSumFun(SumInt,
AddInt,
long,
int)
…..
Int
array[100];
Read(array);
Long
sum
=
SumInt(array,
100);
…..
3.
所有可替換參數(shù)均為宏
至少需要一個額外的文件(實現(xiàn)文件)為
impsum.c
/*
impsum.c
*/
RetType
FunName(const
ElemType
*array,
int
n)
{
RetType
sum
=
0;
for
(int
i
=
;
i
n
;
++i)
Add(sum,
i);
return
sum;
}
使用時:
#undef
RetType
#undef
FunName
#undef
ElemType
#undef
Add
#define
AddInt(x,
y)
((x)
+=
(y))
#define
RetType
long
#define
FunName
SumInt
#define
ElemType
int
#define
Add
AddInt
#include
impsum.c
…..
Int
array[100];
Read(array);
Long
sum
=
SumInt(array,
100);
4.
總結(jié):
第一種方法,易于跟蹤調(diào)試,但是效率低下,適用于對可變函數(shù)(函數(shù)指針)的效率要求不高,但程序出錯的可能性較大(復(fù)雜),模板函數(shù)(Sum)本身很復(fù)雜,模板參數(shù)也比較復(fù)雜(add)的場合。
第二種方法,效率高,但很難跟蹤調(diào)試,在模板函數(shù)和模板參數(shù)本身都很復(fù)雜的時候更是如此。
第三種方法,是我最近幾天才想出的,我認(rèn)為是最好的,在模板參數(shù)(Add)比較復(fù)雜時可以用函數(shù)(第二種也可以如此),簡單時可以用宏,并且,易于調(diào)試。在模板函數(shù)本身很復(fù)雜,而模板參數(shù)比較簡單時更為優(yōu)越。但是,可能有點繁瑣。
首先,C沒有函數(shù)模版。C++才有。
其次,template class T是函數(shù)聲明的一部分,所以下面函數(shù)實現(xiàn)應(yīng)該是:
template class T
void swap(T a,T b){
int temp;
temp=a;
a=b;
b=temp;
}
最后,#include iostream,在標(biāo)準(zhǔn)的C++函數(shù)中,std的域中已經(jīng)有一個swap函數(shù)。
而且前面也using namespace了。函數(shù)聲明重復(fù)。
兩個辦法:
1 swap(i,j);改為 ::swap(i,j); //全局化。
2 swap改個名字。
網(wǎng)站題目:c語言函數(shù)封裝模板 c語言封裝函數(shù)是什么意思
瀏覽地址:http://www.chinadenli.net/article34/hihdpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營銷推廣、網(wǎng)站內(nèi)鏈、動態(tài)網(wǎng)站、自適應(yīng)網(wǎng)站、做網(wǎng)站、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)