首先介紹類的名字TimeStamp,這個單詞字母的意思是時間戳,可以想象郵局寄出信件的時間戳,即信件寄
出時蓋的當天的時間的章,它代表一個時間來作爲標記,以備使用,比如需要記錄日誌時,把這個時刻的
時間傳給TimeStamp,後面的其他日誌記錄類真正的記錄時,可以拿這個TimeStamp的時間作爲事件的發生
時刻;
在整個工程裏搜索TimeStamp,這樣可以找到所有使用時間戳的地方,然後一個一個的研讀,
首先,LoggingEvent類會使用到這個時間戳BasicLayout
學到的語法有二:
1,::的使用,除了可以作爲C++的域作用符外,還有一個用法是表示:當在類內部使用函數時,如果類內
部的函數和全局函數有重名,默認調用的是類內部的成員函數,這個時候如果想調用全局函數,則可以用
這個::,它代表不使用類的成員函數,而是使用外部的全局函數;比如::gettimeofday(&tv, NULL);
2,當存在未知數據大小的時候,可以使用 ostringstream 來代替 sprintf , 避免總是申請大量的緩衝區.
如果要重複使用一個ostringstream對象,並且需要在下次使用前清空緩衝區,則可以使用str()函數重設置
緩衝區. 如:
ostringstream osSql;
//first time
osSql<<"SELECT COUNT(*) FROM t_XXXX";
...
clsConnection.Query( osSql );
....
//second time
osSql.str("");//重新使用一個空的緩衝區
osSql<<"INSERT INTO **********"<< strBigText ;
.......
以下轉載 一篇關於 ostringstream 的用法 的文章
在寫程序的時候,我們往往需要對字符串進行格式化, 比如寫SQL語句的時候. 在ANSI C 中可以sprintf(),
在MFC中可以用CString::Format()對字符串進行格式化. 但前者無法實現字符串的動態增加,比如你定義
的字符緩存爲100個字節,如果你格式化以後的內容超出了100個字節,那邊後面的內容就無法看見. 所以一
般來講都爲定義一個足夠的字符緩衝,但這樣的效率是很差的. 後者雖然可以解決這個問題,但有一點,
他和前者一樣,存在着安全隱患. 比如下面的代碼
char buf[100]={0};
const char* str = "string";
sprintf(buf,"this is a string : %s , %s", str);
或者
CString s;
s.Format("this is a string: %s, %s",str);
前面那個%s對應第一個參數str,那麼第二個%s呢, 指針指向何方? 如果你幸運的話,什麼事也不會發生或者
你僅僅獲得一個你覺得莫名奇妙的字符串值. 但更嚴重的情況呢, 不用說----訪問越界!你的程序就等着迎
接臭名遠揚的Windows紅框吧!
如果你使用STL的sstream,那麼一切將歸於寂然:
#include<sstream>
...
ostringstream str;
str<<"this is a str" << "string"<<"and this is a interger<<3<<endl;
你不必考慮字符串的增長問題, 也不用在寫程序時去一一匹配你的format函數的format參數是否一一
匹配(如果你的參數很多,那麼這項檢查工作將是一個讓你頭痛萬分的工作).
一切都是如此的簡單.
如果你想獲取格式化好的字符串, 通過ostringstream::str()函數就可以返回一個string對象, 調用
string::c_str() 或string::data()函數就可以獲得一個指向字符緩衝的char*變量.
另外, 我堅決建議用string替代CString . 因爲CString在設計時考慮到效率問題, 內存是重複利用的,
即:一個進程中所有的CString對象都使用同一個內存緩衝區,且這個內存區運行時不會釋放,直到進程結束
爲止. 如果緩衝不夠,他會無限制往上增長. 如果你設計的系統是一個7*24運行的系統且字符串分析工作量
很大,程序中產生了大量的CString對象的話, 你可能會發現你的內存會不斷的上漲. string同樣有一個很
優秀且高效率的內存管理機制,但他不會死守着你的內存不放,這一點你看看STL的源碼就知道了.
如果你覺定採用STL,那麼建議你使用VC7.0作爲開發環境或者GCC , 因爲這兩款開發工具對STL支持
是還算不錯.尤其是GCC. 如果你堅持用VC6的話,那麼你最好打上SP5補丁包, VC6對STL的支持不夠理想.