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中array和list的形式: array=[value1,valu2,......] list(value1,value2,....)
- value中int的形式: int有两种表示方式,A:由0-9的数字组成 B:由ox开头的16进制数 当然数字前面可以有+-号。
- value中int-64的形式: 由于版本差异,存在两种表示方式:A: 在一个数字后面添加L,例如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方法。
- 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值。
设置读写方式:方法void setOptions (int options),允许一下的操作。
- 异常:只要是程序就会出现异常,这种需要进行类型解析的程序更需要相当注意异常的情况,libconfig对异常的封装很到位,下面我们针对不同的异常情况来了解libconfig的异常:
现在相信大家对libconfig已经有一定了解了,如果你想了解更多可以查看官网,如果你想知道到底怎么使用可以下载libConfig,里面有很多example。谢谢!
C++开源库(一) ----libConfig详解的更多相关文章
- C++开源库(一) ----log4cpp详解
我们在写程序的时候通常会希望将一些信息记录下来,方便我们进行日后的一些信息跟踪,错误排查等等.比如:我们在进行数据库操作的时候,我们通常希望知道现在是程序的哪一部分进行了数据库的操作,所以我们会记录下 ...
- 全网最全的Windows下Python2 / Python3里正确下载安装用来向微信好友发送消息的itchat库(图文详解)
不多说,直接上干货! 建议,你用Anaconda2或Anaconda3. 见 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装用来向微信好友发送消息的itchat库( ...
- python中requests库使用方法详解
目录 python中requests库使用方法详解 官方文档 什么是Requests 安装Requests库 基本的GET请求 带参数的GET请求 解析json 添加headers 基本POST请求 ...
- 【Solr】索引库查询界面详解
目录 索引库查询界面详解 回到顶部 索引库查询界面详解 q:主查询条件.完全支持lucene语法.还进行了扩展. fq:过滤查询.是在主查询条件查询结果的基础上进行过滤.例如:product_pric ...
- c/c++ 标准库 插入迭代器 详解
标准库 插入迭代器 详解 插入迭代器作用:copy等函数不能改变容器的大小,所以有时copy先容器是个空的容器,如果不使用插入迭代器,是无法使用copy等函数的. 例如下面的代码就是错误的: list ...
- c/c++ 标准库 bind 函数 详解
标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参 ...
- 【Linux开发】Linux下jpeglib库的安装详解
Linux下jpeglib库的安装详解 首先要下载所需的库压缩包:jpegsrc.v6b.tar.gz或 jpegsrc.v8b.tar.gz 然后将下载的压缩包随便放在和解压到你喜欢的地方. # t ...
- App域名劫持之DNS高可用 - 开源版HttpDNS方案详解(转)
http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209805123&idx=1&sn=ced8d67c3e2cc3 ...
- 全网最全的Windows下Anaconda2 / Anaconda3里正确下载安装用来向微信好友发送消息的itchat库(图文详解)
不多说,直接上干货! Anaconda2 里 PS C:\Anaconda2\Scripts> PS C:\Anaconda2\Scripts> pip.exe install itch ...
随机推荐
- 早一天把生意做到de
const isMobilePhoneNum = (params) => { const areaCode = params.areaCode || 'cn' const str = param ...
- php总结2——php中的变量、数据类型及转换、运算符、流程控制中的分支结构
2.1 php中的变量: 定义变量:$变量名称=值: 变量名称:$开头 $之后的第一位必须是字母 $第二位之后可以是字母.数字或者是下划线.习惯上变量名称有实际含义,第二个单词后首字母大 ...
- 洛谷 2868 [USACO07DEC]观光奶牛Sightseeing Cows
题目戳这里 一句话题意 L个点,P条有向边,求图中最大比率环(权值(Fun)与长度(Tim)的比率最大的环). Solution 巨说这是0/1分数规划. 话说 0/1分数规划 是真的难,但貌似有一些 ...
- Java for LeetCode 127 Word Ladder
Given two words (beginWord and endWord), and a dictionary, find the length of shortest transformatio ...
- 使用urllib2打开网页的三种方法(Python2)
python2才有urllib2模块,python3把urllib和urllib2封装成了urllib模块 使用urllib2打开网页的三种方法 #coding:utf-8 import urllib ...
- ubuntu 更新软件命令
安装软件最好加权限(sudo) --default-timeout=100 设置超时时间100秒 install -U setuptools 表示更新安装setuptools sudo pip3 -- ...
- [2018-12-07]用ABP入门DDD
前言 ABP框架一直以来都是用DDD(领域驱动设计)作为宣传点之一.但是用过ABP的人都知道,ABP并不是一个严格遵循DDD的开发框架,又或者说,它并没有完整实现DDD的所有概念. 但是反过来说,认真 ...
- 【栈】日志分析(BSOJ2981)
Description M海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志.该日志记录了两类操作:第一类操作为集装箱入库操作,以及该次入库的集装 ...
- 20145239杜文超 《Java程序设计》第8周学习总结
20145239 <Java程序设计>第8周学习总结 教材学习内容总结 通用API 日志API 1.java.util.logging包提供了日志功能相关类与接口,使用日志的起点是logg ...
- 吴恩达机器学习笔记(七) —— K-means算法
主要内容: 一.K-means算法简介 二.算法过程 三.随机初始化 四.二分K-means 四.K的选择 一.K-means算法简介 1.K-means算法是一种无监督学习算法.所谓无监督式学习,就 ...