weiqi7777

svlib(5)- ini文件操作

0
阅读(2159)

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"

二、svlibINI文件支持

svlib实现了cfgFileINI类,实现对INI文件的读取和写入。实现了cfgNodeMap类,来存储INI文件的内容。

svlib中,是以节点(Node)为单位,来管理INI中的内容。如以上的INI文件,有3个节点,分别是hostownerdatabase。这个三个节点,就会存在cfgNodeMap中的cfgNode中。而owner,又包括两个节点,nameorganization。同理,database也是一样。

cfgNodeMap类中,有cfgNode value[string],哈希属组,来存储同一层次的各个节点。在这里就是,hostownerdatabase这三个节点。

clip_image002

代码,这里就不分析了。底层原理,是从INI文件读取一行,然后进行正则匹配,判断之后,放入到DOM结构体中(cfgNodeMap)。

然后在从DOM结构体中,将内容转化到自定义的数据结构中。

三、例子

如对于以下的ini文件。

总共有三个节点,labelstu1stu2stu1stu2又分别有两个节点。

clip_image004

自己定义两个类,分别表示这些节点。注意,这里变量的名字,要和INI文件中的参数名要一致。

clip_image006

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

domdocument object model,是svlib中为了管理树形结构的任意自定义数据,所使用的一种机制。

对于INI文件,svlib首先将INI文件内容,转换成dom结构,然后在将dom结构中的内容,转化到自定义的类中的变量中。

clip_image007

读取INI文件,然后使用deserialize方法,将INI文件的内容,反序列化后,保存在dom结构中。

调用类的fromDOM方法,将dom结构中的内容,转换到类中的变量中。最后访问类中的变量,就可以得到数据。

执行结果:

clip_image009

四、svlib中的bug

svlib提供的源代码,有一些bug存在,不能将INI中的整数,保存到类中的整数变量中,此时需要进行修改源代码,以支持读取整数。

svlib_macros.svh代码中。将SVLIB_DOM_FIELD_INT宏的代码,改为以下代码,支持整数和16进制数据读取。

clip_image011

另外SVLIB_DOM_UTILS_BEGIN宏,也有bug。对于函数__svlib_dom_superfunction__函数,要将参数的名字进行修改,原来的参数,都是没带下划线的,因此,如果INI文件中,如果有的节点名字,叫pruposenamedom,那么就获取不到这些节点的值。所以要将参数名字进行修改。这里参数修改后,后面的宏中的参数,都要进行修改。

clip_image013

Baidu
map