baizy77 发表于 2019-7-2 17:03:52

KS04-14 配置文件-INI格式

本帖最后由 baizy77 于 2019-7-2 20:36 编辑

版权声明---------------------------------------------------------------------------------------------------------------------该文章原创于Qter开源社区(www.qter.org)作者: 女儿叫老白转载请注明出处!---------------------------------------------------------------------------------------------------------------------课程目录: 【独家连载】《Qt入门与提高-GUI产品开发》目录
网页版课程源码 提取码:1uy7
引言------------------------------------------------------------------------------------在前面的章节中,我们介绍了XML格式配置文件的读写。通过练习我们可以知道,其实XML格式的配置文件的扩展性很好,但是编程不太容易,因为不同的XML配置文件可能文件的结构不完全一样,那么我们可能无法用一套代码访问这些配置文件。但是INI格式的配置文件就不同了,它的格式相抵固定,也具备一定的扩展性,本节我们就来看一下INI格式配置文件的设计与访问。
正文------------------------------------------------------------------------------------ 我们先来看一个INI格式的配置文件样例:param.ini


alarm = N
splash = Y

background_color = rgb(255, 0, 0)
bakground_image=bk_gnd.png
可以看出,INI格式配置文件实际是分为不同的主键(group),比如上述示例的"system"、"css"。每个组下面可以添加多个子键的键值对。这就构成了INI格式配置文件。对于这种相对固定的格式,我们就可以进行编写固定程序来访问它。本节的主要内容并不在于如何实现INI格式文件的访问,而是它的访问接口的设计。为了简单起见,我们的INI格式配置文件访问类中用到了QString,因此可能不适合服务类模块调用。我们提供的示例中,INI配置文件访问类名称为CIniConfig。首先,我们提供接口用来设置ini文件名:
/*
    * @brief 设置配置文件的文件名,使用全路径,不支持环境变量.
    * @param strFileName 文件名
    * @return true:成功,false:失败
    */
      boolsetFileName(const QString& strFileName);

接着就是访问配置项的接口定义,我们提供了boolean、int、double、string类型的定义。因为这些接口类似,所以我们选区boolean类型的接口来介绍。
/**
      * @brief 读取bool类型的键值
      * @param strKey 主键
      * @param strSubKey 子键
      * @param i_nDefault 默认值
      * @param o_bRet true:成功, false:失败
      * @return 数据
      */
      boolgetBoolean(const QString& strKey, const QString& strSubKey, bool i_nDefault, bool* o_bRet = NULL);
为了解释这个接口,我们来看下面的ini样例:

alarm = N
splash = Y

background_color = rgb(255, 0, 0)
bakground_image=bk_gnd.png
在getBoolean()接口中,第一个参数是主键,相当于ini文件中的的"system";第二个参数是子键,相当于ini文件中的"alarm"和"splash";第三个参数是默认值;最后一个参数用来返回接口调用的结果,如果调用者传入了有效地址,当所查询的配置项存在时,o_bRet地址中将被写入true,否则写入false。为了方便,查询到的配置直接以函数返回值的方式传递给调用者。
我们再来看一下set接口。
/**
      * @brief 设置bool类型的键值
      * @param strKey 主键
      * @param strSubKey 子键
      * @param i_nValue 子键的值
      * @return true:成功, false:失败
      */
      boolsetBoolean(const QString& strKey, const QString& strSubKey, bool i_nValue);


如上述代码所示,setBoolean()接口更简单,前两个参数分别表示主键和子键,第三个参数表示新的配置项的值。
为了方便,我们还提供了增删配置项的接口。
/**
   * @brief 删除全部键值
   * @return true:成功,false:失败
   */
      booldeleteAllKeys();
/**
* @brief 删除指定主键
    * @param strKey 主键
    * @return true:成功,false:失败
    */
      boolremoveKey(const QString& strKey);      
      /**
    * @brief 删除指定子键
    * @param strKey 主键
    * @param strSubKey 子键
    * @return true:成功,false:失败
    */
      boolremoveSubKey(const QString& strKey, const QString& strSubKey);


上面三个接口分别用来删除所有主键(子键会级联删除)、删除指定主键、删除指定子键。
另外,该类还提供了如下接口:
/**
    * @brief 读取键值列表, ,比如传入("config""),得到, "x=xx\ny=yy\nz=zz"
    * @param strKey 主键
    * @return 键值列表
    */
    QString getAllKeys(const QString& strKey);

    /**
    * @brief 设置键值列表, ,比如传入("config", "x=xx\ny=yy\nz=zz")
    *         执行后的结果:
    *         
    *         x=xx
    *         y=yy
    *         z=zz
    * @param strKey 主键
    * @param str 子键值值列表,\n分隔。比如: "x=xx\ny=yy\nz=zz"
    * @return 结果,true:成功, false:失败
    */      
    bool setAllKeys(const QString& strKey, const QString& Str);


其中,getAllKeys()接口用来获取某个主键的子键值对列表。setAllKeys()接口用来设置指定主键的子键值对列表。
在示例代码中,我们对主要的接口进行了演示。请大家对照demo进行调试练习。
结语
------------------------------------------------------------------------------------
因为其简便易用的特性,ini格式的配置文件在软件研发中广泛使用。但是表面上来看,ini格式的配置文件仅支持两级(主键+子键),不像XML格式的配置文件那样理论上可以支持无限级别。实际上,我们可以通过扩展子键的键值对的含义来使得ini格式的配置也像XML格式那样拥有一定的扩展性。比如我们把子键值对的值设计成下面的样子:


cfg = ,


在上面的ini配置文件中,cfg的值是一个用","分割的多个数值的组合,使用者可以在读取到该值后自行解析。这个cfg的设计就有一定的扩展性。
除了存取配置之外,我们还会将内存中的对象或数据序列化到文件中,以便下次重新启动时可以继续使用上次的断面,这些内容我们将在后面的章节为大家介绍。

上一节:KS04-13   配置文件-XML格式下一节:KS04-15   类的二进制格式序列化-保存

页: [1]
查看完整版本: KS04-14 配置文件-INI格式