svlib(5)- ini文件操作
0赞svlib支持了对ini文件操作的支持,包括读写ini。
一、INI文件
INI文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统,或是其他操作系统上,许多程序也会采用INI文件作为设置程序之用。Windows操作系统后来以注册表的形式替换掉INI档。INI文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。
格式:
节:
[section]
参数:
name=value
注解:
注解使用分号表示(;)。在分号后面的文字,直到该行结尾都全部为注解。
; comment text
以下是ini文件的例子:
; last modified 1 April 2001 by John Doe host=localhost [owner] name=John Doe organization=Acme Widgets Inc. [database] ; use IP address in case network name resolution is not working server=192.0.2.62 port=143 file="payroll.dat" |
二、svlib对INI文件支持
svlib实现了cfgFileINI类,实现对INI文件的读取和写入。实现了cfgNodeMap类,来存储INI文件的内容。
svlib中,是以节点(Node)为单位,来管理INI中的内容。如以上的INI文件,有3个节点,分别是host,owner,database。这个三个节点,就会存在cfgNodeMap中的cfgNode中。而owner,又包括两个节点,name和organization。同理,database也是一样。
在cfgNodeMap类中,有cfgNode value[string],哈希属组,来存储同一层次的各个节点。在这里就是,host,owner,database这三个节点。
代码,这里就不分析了。底层原理,是从INI文件读取一行,然后进行正则匹配,判断之后,放入到DOM结构体中(cfgNodeMap)。
然后在从DOM结构体中,将内容转化到自定义的数据结构中。
三、例子
如对于以下的ini文件。
总共有三个节点,label,stu1,stu2。stu1和stu2又分别有两个节点。
自己定义两个类,分别表示这些节点。注意,这里变量的名字,要和INI文件中的参数名要一致。
svlib中,提供了5个宏,来实现对节点的注册。
SVLIB_DOM_UTILS_BEGIN:表示注册开始,参数是类名
SVLIB_DOM_FIELF_OBJECT:注册一个对象
SVLIB_DOM_FIELD_STRING:注册一个字符串
SVLIB_DOM_FIELD_INT:注册一个整数
SVLIB_DOM_FIELD_END:表示注册结束
注册之后,就会在类中增加两个方法,
fromDom:将dom的内容,保存在类中变量中
toDom:将类中的变量,保存在dom中
dom,document object model,是svlib中为了管理树形结构的任意自定义数据,所使用的一种机制。
对于INI文件,svlib首先将INI文件内容,转换成dom结构,然后在将dom结构中的内容,转化到自定义的类中的变量中。
读取INI文件,然后使用deserialize方法,将INI文件的内容,反序列化后,保存在dom结构中。
调用类的fromDOM方法,将dom结构中的内容,转换到类中的变量中。最后访问类中的变量,就可以得到数据。
执行结果:
四、svlib中的bug
svlib提供的源代码,有一些bug存在,不能将INI中的整数,保存到类中的整数变量中,此时需要进行修改源代码,以支持读取整数。
在svlib_macros.svh代码中。将SVLIB_DOM_FIELD_INT宏的代码,改为以下代码,支持整数和16进制数据读取。
另外SVLIB_DOM_UTILS_BEGIN宏,也有bug。对于函数__svlib_dom_superfunction__函数,要将参数的名字进行修改,原来的参数,都是没带下划线的,因此,如果INI文件中,如果有的节点名字,叫prupose,name,dom,那么就获取不到这些节点的值。所以要将参数名字进行修改。这里参数修改后,后面的宏中的参数,都要进行修改。