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文件,libo这样一种嵌套的模式。
      • 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"
  • 经过上面的学习我们已经差不多了解了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方法。
      • 查找属性:方法:setting & lookup(const std::string &path)这个方法通过输入path,返回setting。同时还提供了boolLookupValue(std::string path,bool $value);来判断在path目录下是否存在value值。

现在相信大家对libconfig已经有一定了解了,如果你想了解更多可以查看官网,如果你想知道到底怎么使用可以下载libConfig,里面有很多example。谢谢!
原文链接: https://www.cnblogs.com/liboBlog/p/6123699.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/244933

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 上午12:29
下一篇 2023年2月14日 上午12:29

相关推荐