目前,我们常用的配置文件格式有XML和ini, XML层次分明,但其缺点就是写起来太繁杂,对一些关键字如<>之类的处理比较特殊。而ini呢,配置不够灵活,只有简单的段-键-值模式,对于一些多层结构的配置,或者一些列表类型的配置,就显得力不从心了,往往需要编码人员自己分割字符串。
Lua脚本非常简洁清晰,是非常适合做配置文件的,无论是映射表型配置,还是列表型配置,还是简单的键值配置,lua都可以完全胜任。而且lua格式清新简洁,一看就懂。
所以,用lua作为程序的配置文件是非常明智的,但是,在C++中解释lua脚本的配置文件,仅仅通过lua提供的原始API,就显得非常吃力了,所以我封装了这个lua脚本配置文件解释器,用起来非常方便。
LConfig下载地址:http://www.kuaipan.cn/file/id_28924397125373532.htm
LConfig支持跨平台(Windows,Linux)
下面是一个配置文件的例子:
i = 13433 x = "wo shi shui" y = "沈璧君" tb = { x = 23, h = 232, } tb2 = {12,13,14,15,16}
可见,lua非常简洁,并支持非常灵活强大的配置方式,绝对可以胜任一切的配置要求
下面是程序中读取该配置文件的代码:
int main() { CLConfig conf; CElement* root = conf.loadLFile("conf.lua"); // 随时可以通过getRoot方法获取root元素 //root = conf.getRoot(); // 获取子元素x的字符值,如果x子元素不存在,则返回默认值 std::cout << "x=" << root->getStringElementDefalut("x", "x not found") << std::endl; // 获取子元素y的值,这种方式需要先判断获取的y元素对象是否存在 CElement* yElem = root->getElement("y"); if (yElem) { std::cout << "y=" << yElem->getStringValueDefalut() << std::endl; // 获取y的数字类型,如果y非数字,则返回默认值 std::cout << "y(int)=" << yElem->getIntegerValueDefault(100) << std::endl; } // 获取一个没有配置的元素,返回默认值 std::cout << "no=" << root->getStringElementDefalut("no", "hello world") << std::endl; CElement* tb = root->getElement("tb"); //获取tb表中x字段的值 std::cout << "tb:x=" << tb->getElement("x")->getIntegerValueDefault() << std::endl; // 获取tb表中h字段的值,如果该字段不存在,则默认为30 std::cout << "tb:h=" << tb->getIntegerElementDefault("h", 30) << std::endl; // 获取tb2中key为1的字段的值,tb2是列表,默认key从1开始递增 std::cout << "tb2:[1]=" << root->getElement("tb2")->getElement("1")->getIntegerValueDefault() << std::endl; // 获取tb2中key为5的字段的值,tb2是列表,默认key从1开始递增 std::cout << "tb2:[5]=" << root->getElement("tb2")->getElement("5")->getDoubleValueDefault() << std::endl; // 遍历tb2列表中的所有值 ElementMap* elems = root->getElement("tb2")->getElementMap(); for (ElementMap::iterator it = elems->begin(); it != elems->end(); ++it) { // 如果有些值不是数字类型,则返回为默认值100. std::cout << "tb2 elem:" << it->second->getIntegerValueDefault(100) << std::endl; } /// 释放资源,析构函数会自动调用 //conf.release(); getchar(); return 0; }
以下是输出结果
可见,使用LConfig读取lua配置,是如此的简单!
那么,如何在我们的代码中使用LConfig呢?
首先,下载LConfig的源代码,LConfig的源代码中自带了lua5.1.5版本的代码,不用动它们,直接将LConfig的代码放入我们的工程的源代码中,然后在我们的源程序中包含LConfig.h就可以了,使用方式参考上面的例子,够详细的了。
LConfig下载地址:http://www.kuaipan.cn/file/id_28924397125373532.htm