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方法。
      • 设置读写方式:方法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。谢谢!

时间: 2024-10-07 09:01:02

C++开源库(一) ----libConfig详解的相关文章

&lt;Android开源库&gt; GreenDAO 用法详解&lt;译文&gt;

简介 greenDAO是一个开源的Android ORM,使SQLite数据库的开发再次变得有趣. 它减轻了开发人员处理底层的数据库需求,同时节省开发时间. SQLite是一个很不错的关系型数据库. 尽管如此,编写SQL和解析查询结果仍然是相当乏味和耗时的任务. greenDAO通过将Java对象映射到数据库表(称为ORM,"对象/关系映射")来解决这些问题. 这样,您可以使用简单的面向对象的API来存储,更新,删除和查询Java对象. 特性 最高性能(可能是Android中最快的OR

[C] linux静态链接库与动态链接库详解

http://blog.chinaunix.net/u2/76292/showart.php?id=1274181 一顺便说说了哦  通常情况下,对函数库的链接是放在编译时期(compile time)完成的.所有相关的对象文件(object file)与牵涉到的函数库(library)被链接合成一个可执行文件(executable file).程序在运行时,与函数库再无瓜葛,因为所有需要的函数已拷贝到自己门下.所以这些函数库被成为静态库(static libaray),通常文件名为"libxx

【Solr】索引库查询界面详解

目录 索引库查询界面详解 回到顶部 索引库查询界面详解 q:主查询条件.完全支持lucene语法.还进行了扩展. fq:过滤查询.是在主查询条件查询结果的基础上进行过滤.例如:product_price:[10 TO 20] sort:排序条件.排序的域asc.如果有多个排序条件使用半角逗号分隔. start, rows:分页处理.Start起始记录rows每页显示的记录条数. fl:返回结果中域的列表.使用半角逗号分隔. df:默认搜索域. wt:响应结果的数据格式,可以是json.xml等.

c/c++ 标准库 bind 函数 详解

标准库 bind 函数 详解 bind函数:接收一个函数名作为参数,生成一个新的函数. auto newCallable = bind(callbale, arg_list); arg_list中的参数可能包含入_1, _2等,这些是新函数newCallable的参数. 在这篇博客lambda 表达式 介绍 中,讨论了find_if的第三个参数的问题,当时是用lambda表达式解决的,有了bind函数后,也可以用bind函数解决. 解决办法:bind(check_size, _1, sz) au

App域名劫持之DNS高可用 - 开源版HttpDNS方案详解(转)

http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=209805123&idx=1&sn=ced8d67c3e2cc3ca38ef722949fa21f8&3rd=MzA3MDU4NTYzMw==&scene=6#rd 主题 开源 本文根据冯磊和赵星宇在“高可用架构”微信群所做的HttpDNS智能缓存库原理整理而成,转发请注明来自微信公众号ArchNotes. 冯磊,目前主要从事手机应用平台的构建,任职新浪网技术

Quartz.net开源作业调度框架使用详解(转)

前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计划调度的一个小项目,来辅助理解quartz.n

Quartz.net开源作业调度框架使用详解

前言 quartz.net作业调度框架是伟大组织OpenSymphony开发的quartz scheduler项目的.net延伸移植版本.支持 cron-like表达式,集群,数据库.功能性能强大更不用说. 下载项目文档官网:http://www.quartz-scheduler.net/ 项目中需引用:Common.Logging.dll , Common.Logging.Core.dll , Quartz.dll 下面给大家分解下我最近做的关于计划调度的一个小项目,来辅助理解quartz.n

Android第三方开源框架之SlidingMenu详解 [转载]

SlidingMenu简介:       SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者右滑出现设置界面,能方便的进行各种操作.目前有大量的应用都在使用这一效果.如Evernote.Google+.Foursquare等,国内的豌豆夹,人人,360手机助手等都使用SlidingMenu的界面方案. 开源框架下载地址,集成了另一个开源项目ActionBarSherlock:点击下载.              注意: SlidingMenu依赖于另一个开源项目Act

C++ Primer 学习笔记_56_STL剖析(十一)(原boost库):详解智能指针(unique_ptr(原scoped_ptr) 、shared_ptr 、weak_ptr源码分析)

注意:现在boot库已经归入STL库,用法基本上还和boost类似 在C++11中,引入了智能指针.主要有:unique_ptr, shared_ptr, weak_ptr. 这3种指针组件就是采用了boost里的智能指针方案.很多有用过boost智能指针的朋友,很容易地就能发现它们之间的关间: std boost 功能说明 unique_ptr scoped_ptr 独占指针对象,并保证指针所指对象生命周期与其一致 shared_ptr shared_ptr 可共享指针对象,可以赋值给shar