独家解读:简单又强大的配置文件 Config 读写类

一、引言

在项目过程中,难免会需要一个方便的配置文件读写类,它可以像游戏的存档文件一样,记录着我们当前项目的配置信息,以至于方便我们每次初始化运行的时候可以从这个配置文件读取上一次的配置信息,当然也可以在程序运行过程中记录用户的配置设置信息。

我们理想中的这个配置文件读写类,它要有以下这些方法:

1. 支持读入一个指定配置文件的能力

2. 支持随时加入一个配置项的能力

3. 足够强大,能够写入各种数据结构的配置信息

满足以上条件的配置文件读写类才是我们想要的。这篇博客显然不是一步一步介绍如何写出这样一个类的文章(这不是一件容易的事情,即使写出来也会千疮百孔),而是一篇在网上已有的流传久远的一个短小精悍的配置文件 Config 读写类的基础上的解读分析文章。

我找到的这个短小精悍的配置文件 Config 读写类是来自于这篇博客:
C++编写Config类读取配置文件

这篇博客的作者仅仅粘贴出了这个 Config 类的代码以及简简单单的几行测试代码,对于大多数新手来说并不友好,因此我特意在阅读了相关代码并且自行建立测试项目进行了测试之后,萌发了想要写一篇博客来好好解读这个 Config 类的原理和用法的想法。

由于不喜欢在博客里面大篇幅的粘贴代码,因此想要获取到这个配置文件 Config 读写类的同学可以在我的 GitHub 上阅读这个类(也就简简单单三个文件:一个 Config.h,另一个是 Config.cpp,testconfig.cpp 则是用来测试的文件而已):
wangying2016/Config

那么接下来,就让我们一步一步分析这个配置文件 Config 读写类的设计与实现吧!

二、Config 设计之:数据结构

要想了解一个类的设计与实现,最好的方法就是去了解它的设计目标,即需要满足的需求。

这里我们需要了解的就是,一个配置文件的内容究竟是什么样子的:

config contents

由上图可知,我们的一个配置文件,是由两部分组成的:

1. 注释内容:在示例文件中是由 # 来单行注释表示的,用来解释一些必要内容

2. 配置项内容:配置内容其实就是一个一个的键值对的记录,左侧是 key 值,比如这里的 name 值,右侧是 value 值,对应这里的 wangying。而在键值对中间,间插了一个符号 =(当然可以自定义的)来分割 key 值和 value 值。

可知,其实配置文件的内容是非常简单明了的。接下来,我们则需要将这种看似简单的文件结构抽象成我们熟悉的程序设计领域的数据结构。

如果你学过主流编程语言的话,这里的键值对应该会让你想起那么几个词:
maphashdictionary 等等
在程序员的世界里,键值对其实就是我们的映射。比如在 C++ 里,我们要存储这样的数据就使用 std::map 即可。

也就是说,我们的 Config 类中,需要有一个最基本最基本的存储配置文件键值对信息的 std::map 成员,这个成员用来将配置文件中的每个 key 值和其对应的 value 值记录下来。

那么另外一个问题也就来了,我们的 std::map 究竟应该是什么类型的呢?

哈哈,这个问题其实非常简单,因为我们的键值对信息都是要读出写入到文件的,那么 std::map 不论是 key 值还是 value 值都将会是字符串类型,即 C++ STL 的 std::string (Config 类不支持中文编码)类即可。

那么有人就会问了,如果 value 值只是一个简简单单的 std::string 类的话,我想要存储一个非常复杂的数据结构怎么办,比如一个 phone key 值,对应了一个电话号码列表呢?

这个问题其实也非常简单,这里的 std::map 成员只是 Config 类中的最基本最基本存储到文件里的字符串键值对记录,而 Config 为了支持用户存储多种复杂的 value 值,还提供了模板支持。因此,这里只需要你提供的 value 值的结构可以被转化为 std::string 类型,就可以使用 Config 类来存储你的数据结构了。

因此,让我们看看 Config 类的代码:

std::string m_Delimiter;  //!< separator between k
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值