现在的位置: 首页 > 综合 > 正文

LConfig:利用Lua脚本做程序的配置文件

2013年07月27日 ⁄ 综合 ⁄ 共 2121字 ⁄ 字号 评论关闭

    目前,我们常用的配置文件格式有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

抱歉!评论已关闭.