freecplus是一個Linux系統下的C/C++開源框架,源代碼請前往C語言技術網(www.freecplus.net)下載。數據庫
本文介紹的是freecplus框架中加載參數文件的方法。數組
函數和類的聲明文件是freecplus/_freecplus.h。服務器
函數和類的定義文件是freecplus/_freecplus.cpp。數據結構
示例程序位於freecplus/demo目錄中。框架
編譯規則文件是freecplus/demo/makefile。ide
在項目開發中,一個完整的系統由多個C/C++服務程序組成,這些服務程序有共同的參數,例如數據庫的鏈接參數、日誌文件存放的目錄、數據文件存放的目錄等。函數
傳統的方法是把參數放在文本文件中,例如hssms.ini,格式以下:.net
logpath=/log/hssms # 日誌文件存放的目錄。 connstr=hssms/smspwd@hssmszx # 數據庫鏈接參數。 datapath=/data/hssms # 數據文件存放的根目錄。 serverip=192.168.1.1 # 中心服務器的ip地址。 port=5058 # 中心服務器的通訊端口。 online=true # 是否採用長鏈接。
如今有更好的方法是把參數放在xml文件中,例如hssms.xml,格式以下:日誌
<?xml version="1.0" encoding="gbk" ?> <root> <!-- 程序運行的日誌文件名。 --> <logpath>/log/hssms</logpath> <!-- 數據庫鏈接參數。 --> <connstr>hssms/smspwd@hssmszx</connstr> <!-- 數據文件存放的根目錄。 --> <datapath>/data/hssms</datapath> <!-- 中心服務器的ip地址。 --> <serverip>192.168.1.1</serverip> <!-- 中心服務器的通訊端口。 --> <port>5058</port> <!-- 是否採用長鏈接,true-是;false-否。 --> <online>true</online> </root>
通常來講,一個項目是由多種語言開發完成,xml文件格式比傳統的ini文件格式更方便。code
CIniFile類用於服務程序從參數文件中加載參數。
// 參數文件操做類。 // CIniFile類操做的是xml格式的參數文件,並非傳統的ini文件。 class CIniFile { public: // 存放參數文件所有的內容,由LoadFile載入到本變量中。 string m_xmlbuffer; CIniFile(); // 把參數文件的內容載入到m_xmlbuffer變量中。 bool LoadFile(const char *filename); // 獲取參數文件字段的內容。 // fieldname:字段的標籤名。 // value:傳入變量的地址,用於存放字段內容,支持bool、int、insigned int、long、unsigned long、double和char[]。 // 注意,當value參數的數據類型爲char []時,必須保證value數組的內存足夠,不然可能發生內存溢出的問題, // 也能夠用ilen參數限定獲取字段內容的長度,ilen的缺省值爲0,表示不限定獲取字段內容的長度。 // 返回值:true-獲取成功;false-獲取失敗。 bool GetValue(const char *fieldname,bool *value); bool GetValue(const char *fieldname,int *value); bool GetValue(const char *fieldname,unsigned int *value); bool GetValue(const char *fieldname,long *value); bool GetValue(const char *fieldname,unsigned long *value); bool GetValue(const char *fieldname,double *value); bool GetValue(const char *fieldname,char *value,const int ilen=0); };
示例(demo45.cpp)
/* * 程序名:demo45.cpp,此程序演示採用freecplus框架的CIniFile類加載參數文件。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" // 用於存放本程序運行參數的數據結構。 struct st_args { char logpath[301]; char connstr[101]; char datapath[301]; char serverip[51]; int port; bool online; }stargs; int main(int argc,char *argv[]) { // 若是執行程序時輸入的參數不正確,給出幫助信息。 if (argc != 2) { printf("\nusing:/freecplus/demo/demo45 inifile\n"); printf("samples:/freecplus/demo/demo45 /freecplus/ini/hssms.xml\n\n"); return -1; } // 加載參數文件。 CIniFile IniFile; if (IniFile.LoadFile(argv[1])==false) { printf("IniFile.LoadFile(%s) failed.\n",argv[1]); return -1; } // 獲取參數,存放在stargs結構中。 memset(&stargs,0,sizeof(struct st_args)); IniFile.GetValue("logpath",stargs.logpath,300); IniFile.GetValue("connstr",stargs.connstr,100); IniFile.GetValue("datapath",stargs.datapath,300); IniFile.GetValue("serverip",stargs.serverip,50); IniFile.GetValue("port",&stargs.port); IniFile.GetValue("online",&stargs.online); printf("logpath=%s\n",stargs.logpath); printf("connstr=%s\n",stargs.connstr); printf("datapath=%s\n",stargs.datapath); printf("serverip=%s\n",stargs.serverip); printf("port=%d\n",stargs.port); printf("online=%d\n",stargs.online); // 如下能夠寫更多的主程序的代碼。 }
運行效果
C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道
若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!