一、源代码说明
freecplus是一个Linux系统下的C/C++开源框架,源代码请前往C语言技术网(www.freecplus.net)下载。
本文介绍的是freecplus框架中加载参数文件的方法。
函数和类的声明文件是freecplus/_freecplus.h。
函数和类的定义文件是freecplus/_freecplus.cpp。
示例程序位于freecplus/demo目录中。
编译规则文件是freecplus/demo/makefile。
二、参数文件的意义
在项目开发中,一个完整的系统由多个C/C++服务程序组成,这些服务程序有共同的参数,例如数据库的连接参数、日志文件存放的目录、数据文件存放的目录等。
传统的方法是把参数放在文本文件中,例如hssms.ini,格式如下:
1 2 3 4 5 6
| logpath=/log/hssms # 日志文件存放的目录。 connstr=hssms/smspwd@hssmszx # 数据库连接参数。 datapath=/data/hssms # 数据文件存放的根目录。 serverip=192.168.1.1 # 中心服务器的ip地址。 port=5058 # 中心服务器的通信端口。 online=true # 是否采用长连接。
|
现在有更好的方法是把参数放在xml文件中,例如hssms.xml,格式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| <?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文件格式更方便。
三、CIniFile类
CIniFile类用于服务程序从参数文件中加载参数。
1、类的声明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
class CIniFile { public: string m_xmlbuffer;
CIniFile();
bool LoadFile(const char *filename);
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); };
|
2、示例程序
示例(demo45.cpp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
|
#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; }
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)
作者:码农有道