zoukankan      html  css  js  c++  java
  • C++开源库(一) ----libConfig详解

      博主天生患有蛋疼疾病,写博不易,转载注明出处http://www.cnblogs.com/liboBlog/,谢谢!

      在写程序的时候必不可少的一个部分就是conf文件的解析,但是如果自己解析的话会比较繁琐,因为需要注意的事项实在是太多,比如:此conf文件中是否include其他文件;或者是在nginx中存在很多key相同的项目,我们应该如何解析;不同的文件类型解析方式不同等等一些繁琐的问题。我们更希望是有一个"做工精良"的库来给我进行封装,个人觉得libconfig就是这样一个很不错的库。

      1.首先我们介绍以下libconfig,libconfig是一个用于进行结构化文件读取,操作,写入的库,提供对c,c++两种语言的支持,运行环境可以是linux,max os,同时也从支持配备vs2005及其之后版本的windows。下面详细说一下liconfig的解析方式。

      2.setting and setting type:   

      • setting:首先我们解释一个什么是setting,在libconfig文件中包含的基本单位就是setting,简单的理解setting就是一组键值对,记录了configure的属性key和值value。
      • setting value:上面我们说道setting的value,居然libconfig这么牛逼,那么libconfig支持一些什么类型的value呢?
        • 可量化的数据:包括int , 64bit int, float,double, boolean, string这几种类型。
        • 数组类型:就是可量化数据组成的数组,当然他们的值必须相等。
        • 组类型:与上面所说的数组不相同,组类型的基本组成是seting,这个其实在配置文件中属于很常见的现象,比如:我们解析一个xml文件,<china><state><name>libo</name></state></china>这样一种嵌套的模式。
        • list:包含一组任意类型的数据。例如解析一下结构:list = ( ( "abc", 123, true ), 1.234, ( /* an empty list */) ); 
      • setting表示:setting有一组由点分隔符分隔的名字唯一标识,并且每一个名字都是一个setting。如果setting是数组中的一个的元素没有name,那么可以使用数组的下标来表示他的name,例如:application.books.[1].title。
      • name的命名规范: setting中的name是严格区分大小写的,只能由字母,数字,破折号-,下划线_,星号*组成,并且必须以字母和星号开头。感觉命名规范有点蛋疼,是不?所以如果我们用libconfig来解析URL的时候就要注意了,比如/usr/local/这样的命名规则是错误的。
      • value的解析规则: 上面我们说了value允许的值的类型,那么它是怎么解析的呢?如果出现”“则解析为string,如果是他是简单的整数,就解析为int或者int_64,如果出现,分隔就解析为数组。大致规则就是这样。
      • setting的形式: name=value或者name:value  当然这里我们是写c,c++的,当然会选择使用=。
      • value中arraylist的形式: array=[value1,valu2,......]     list(value1,value2,....)
      • value中int的形式: int有两种表示方式,A:由0-9的数字组成 B:由ox开头的16进制数  当然数字前面可以有+-号。 
      • value中int-64的形式:  由于版本差异,存在两种表示方式:A: 在一个数字后面添加,例如0L表示的是一个64位的0    B:1.5版本之后会自动进行识别,不用添加L
      • value中浮点数的表示: 由数字和.符号组成,或者是E,同样可选参数+-
      • 文本中的注释: 形式多样化,不仅支持c++中的注释方式还支持脚本的注释方式,/*注释*/       //注释      #注释
      • include:  上面我们提到过libconfig支持conf文件中进行其他文件include,那么这里就得提一下了,语法如下: @include "filename"

      3. 经过上面的学习我们已经差不多了解了conf文件的规则,下面我们来看看C++的api,注意官方提供了C和C++的api,这里我们主要学习一下C++的,有需求的请跳转值libconfig官网查看。这部分的学习我们主要是通过libconfig的类来进行了解libconfig。

      • 异常:只要是程序就会出现异常,这种需要进行类型解析的程序更需要相当注意异常的情况,libconfig对异常的封装很到位,下面我们针对不同的异常情况来了解libconfig的异常:
        • value类型异常: 前面我们已经说过了value支持的类型和一些解析的方式,如果在进行解析的时候发现这个value超出了允许的类型,那么就会抛出SettingTypeException
        • setting not found异常: 当我们在提取数据的时候,如果给了一个错误的setting名,将会抛出SettingNotFoundException
        • setting重复异常: 上面我们已经谈到,setting是由一组name唯一标识的,当我们无法通过name的组合来找到唯一的setting时就会出现SettingNameException异常。   
        • 读取流异常:当从流读取配置时发生解析错误时抛出ParseException异常。 
        • 当然除了上面的异常类型,由于涉及I/O所以我们也应该关注I/O 异常。
      • Conf类: 下面我们说一下Conf类及相关的类的操作。
        • 构造函数: Conf()
        • read和write:  void read(File * stream);     void write(File * stream);  大家注意到没有,这里所说的包含了两种操作,我们不光能够进行conf文件的读取,也能够写入。注意异常抛出。同时还有readFile/writeFile方法。
        • 设置读写方式:方法void setOptions (int options),允许一下的操作。
          • OptionAutoConvert(0x01): 自动进行值获取,注意:这个解析方式会导致解析错误,比如把int解析为float,默认情况不采用这种方式。
          • OptionSemicolonSeparators(0x02):分号分隔方式,主要是进行配置写入的时候添加:,此设置可选,但是默认是采用的。
          • OptionColonAssignmentForGroups(0x04): 组内key/value分隔符,如果不设置key与value之间为=,如果开启则是':',主要是在写入的时候,默认是采用的。
          • OptionColonAssignmentForNonGroups(0x08): 非组内key/value分隔符,如果不设置key与value之间为=,如果开启则是':',主要是在写入的时候,默认是不采用的。
          • OptionOpenBraceOnSeparateLine(0x10): 当写入的时候是否再行首添加‘{’,如果不设置,则会在上一行结尾添加。默认采用的。
        • 查找属性:方法:setting & lookup(const std::string &path)这个方法通过输入path,返回setting。同时还提供了boolLookupValue(std::string path,bool $value);来判断在path目录下是否存在value值。

      现在相信大家对libconfig已经有一定了解了,如果你想了解更多可以查看官网,如果你想知道到底怎么使用可以下载libConfig,里面有很多example。谢谢!

  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/liboBlog/p/6123699.html
Copyright © 2011-2022 走看看