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


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

  • 相关阅读:
    单元测试多租户数据库提供商
    在ASP.NET Core上实施每个租户策略的数据库
    再起航,我的学习笔记之JavaScript设计模式30(简单模板模式)
    再起航,我的学习笔记之JavaScript设计模式29(节流模式)
    笨鸟先飞之ASP.NET MVC系列之过滤器(02授权过滤器)
    再起航,我的学习笔记之JavaScript设计模式28(委托模式)
    笨鸟先飞之ASP.NET MVC系列之过滤器(01过滤器简介)
    再起航,我的学习笔记之JavaScript设计模式27(链模式)
    再起航,我的学习笔记之JavaScript设计模式26(解释器模式)
    再起航,我的学习笔记之JavaScript设计模式25(迭代器模式)
  • 原文地址:https://www.cnblogs.com/moodlxs/p/2780466.html
Copyright © 2020-2023  润新知