lua:lua作配置文件-程序员宅基地

技术标签: lua  c/c++  

lua的一项重要用途就是作为一种配置语言(configuration language)。

目前,我们常用的配置文件格式有XML和ini,  XML层次分明,但其缺点就是写起来太繁杂,对一些关键字如<>之类的处理比较特殊。而ini呢,配置不够灵活,只有简单的段-

键-值模式,对于一些多层结构的配置,或者一些列表类型的配置,就显得力不从心了,往往需要编码人员自己分割字符串。

Lua脚本非常简洁清晰,是非常适合做配置文件的,无论是映射表型配置,还是列表型配置,还是简单的键值配置,lua都可以完全胜任。而且lua格式清新简洁,一看就懂。

下面的代码主要是读变量和table。

mycon.lua

--my config 

width = 300
height = 400

luat_Test1={a=123, b=456, c=789}
luat_Test2={
    123, 456, 789}

这里说个题外话,Lua不会根据一个范围的值来创建表,而是根据设定的单个值来创建表内容,比如:

textTable = {}

textTable[2000] = "hello 2000!"

这里虽然会生成许多未使用的Key,但不必担心这个方法会牺牲任何表的存储空间。

main.cpp

#include<stdio.h>  
  
//如不用extern会出现连接错误,编译成了C++文件  
extern "C"   
{  
#include "lua.h"  
#include "lauxlib.h"  
#include "lualib.h"  
}  
  
#pragma comment(lib, "lua5.1.lib")  
  
void ReadVariable (lua_State *L,int *width,int *height){  
    lua_getglobal(L,"width");   //获得Lua中变量的值,将其放入栈中  
    lua_getglobal(L,"height");  
  
    if(!lua_isnumber(L,-2))     //栈顶为-1,然后依次减少  
        luaL_error(L,"`width' should be a number\n");  
  
    if(!lua_isnumber(L,-1))  
        luaL_error(L,"`height' should be a number\n");  
    *width = (int)lua_tonumber(L,-2);    //将栈顶元素转化为数字  
    *height = (int)lua_tonumber(L,-1);  
    printf("width is %d ,height is %d\n\n",*width,*height);  
}  
  
static void ReadTableFromItem(lua_State *L, const char* lpszTableName, const char* lpszTableItem)  
{  
    lua_getglobal(L, lpszTableName);  
  
    lua_pushstring(L, lpszTableItem);//首先把元素的名字压入栈顶  
    lua_gettable(L, -2);//值会放在栈顶,同时刚才压入的元素名字被弹出  
    printf("%s.%s=%d\n", lpszTableName, lpszTableItem, (int)lua_tonumber(L, -1));  
    lua_pop(L, 2);  
}  
  
static void ReadTableFromIndex(lua_State *L, const char* lpszTableName, int index)  
{  
    lua_getglobal(L, lpszTableName);  
    lua_rawgeti(L, -1, index);//获得第一个元素  
    printf("%s[%d]=%d\n", lpszTableName, index, (int)lua_tonumber(L, -1));  
    lua_pop(L, 2);  
}  
  
static void EnumTableItem(lua_State *L, const char* lpszTableName)  
{  
    lua_getglobal(L, lpszTableName);  
    int it = lua_gettop(L);  
    lua_pushnil(L);  
    printf("Enum %s:", lpszTableName);  
    while(lua_next(L, it))//用lua_next可以遍历这个数组  
    {  
        printf("  %d", (int)lua_tonumber(L, -1));  
        lua_pop(L, 1);  
    }  
    printf("\n\n");  
    lua_pop(L, 1);  
}  
  
int main(int argc, char* argv[])  
{  
    if (argc != 2)  
    {  
        printf("param error!\n");  
        return 0;  
    }  
  
    char *filename = argv[1];  
  
    lua_State *L = lua_open();  
    luaL_openlibs(L);  //新版本库添加的方法  
    if(luaL_loadfile(L,filename) || lua_pcall(L,0,0,0)){  
        luaL_error(L,"loadfile error! %s \n",lua_tostring(L,-1));  
    }  
  
    int w=1,h=2;  
    ReadVariable(L,&w,&h);  
  
    ReadTableFromItem(L, "luat_Test1", "a");  // 等价与lua代码:print(luat_Test1.a)  
    ReadTableFromItem(L, "luat_Test1", "b");  
    ReadTableFromItem(L, "luat_Test1", "c");  
    EnumTableItem(L, "luat_Test1");    // 枚举Table  
  
    ReadTableFromIndex(L, "luat_Test2", 1);  // 等价与lua代码:print(luat_Test1[1])  
    ReadTableFromIndex(L, "luat_Test2", 2);  
    ReadTableFromIndex(L, "luat_Test2", 3);  
    EnumTableItem(L, "luat_Test2");  
    getchar();
    return 0;
}

 

关于配置文件安全的问题,一般会将这些lua文件进行加密。

配置文件多数以excel转lua的方式配置,网上也有很多相关工具。例如用xlrd

转载于:https://www.cnblogs.com/losophy/p/9257470.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/a857351839/article/details/101564744

智能推荐

FFmpeg WAV文件转换_ffmpeg mp4转wav-程序员宅基地

文章浏览阅读4.2k次。FFmpeg WAV文件转换_ffmpeg mp4转wav

PMI-ACP练习题(17)_根据敏捷宣言以下哪一项属于敏捷原则-程序员宅基地

文章浏览阅读211次。A. Defect-stream and Value-stream B. Information-flow and information-owner C. Value-added and non value-added D. Sigma-ranked and Theta-prioritized 哈利的敏捷团队刚完成了其中一个产品的价值流程图。_根据敏捷宣言以下哪一项属于敏捷原则

开发者必知的8款App快速开发工具-程序员宅基地

文章浏览阅读2.5k次。“我有一个好创意,就差一个CTO……” “原生APP开发难度大,周期长,成本高,还没上线市场已经被占领了。” “APP版本迭代更新,都是企业的一道难关,没有一个一劳永逸的解决方式吗?” “一个Web开发者如何能快速适应移动互联网时代,用HTML5开发出一个APP呢?” “安卓、IOS双平台同时开发,程序员都累死在加班的路上了……”针对行业痛点,国内外涌现出众多APP开发工具,开发者只要有相..._开发app 开发工具

Centos curl command not found_centos cur command not found-程序员宅基地

文章浏览阅读1.2k次。试过了很多帖子的办法,各种安装都不行这个亲测可以: yum install -y curl 或者 sudo yum -y install curl_centos cur command not found

windows安装k8s-程序员宅基地

文章浏览阅读8.1k次。安装minikube minikube安装包下载 下载minikube-linux-amd64 执行命令安装chmod +x minikube &amp;amp;&amp;amp; sudo mv minikube /usr/local/bin/查看版本以及是否安装成功minikube version用指定镜像地址启动minikube start --registry-mirr...

numpy 求矩阵非零元素的均值_非0平均 numpy-程序员宅基地

文章浏览阅读4.5k次,点赞2次,收藏6次。假如我们有一个矩阵A,想要求其中的非零元素的均值,计算方式是:直接用mean来求的话,分母是所有元素的个数,不符合我们的要求。在matlab中,这样做:mean(AA(AA~=0))numpy:import numpy as npa = np.array([[0,1],[0,0]])exist = (a != 0)num = a.sum()mean_value = exist.sum()先用着这种方法吧,简洁的没找到。参考:https://blog.csdn.net/iteapo_非0平均 numpy

随便推点

科技和商业模式的发展真的会导致很多人失业吗?-程序员宅基地

文章浏览阅读393次。前言 众所周知,人类社会科技发展和新机器的发明,常常伴随着商业模式的变革。新的模式常常伴随着旧的模式的淘汰,或者并存,这可以让全社会的生产力和生活质量日渐增高。 随着新机器的层出不穷,每隔一段时间就出现很多人担心会出现所谓的“机器取代人类工作”的谬论,不过..._纺织机刚发明时的担忧

Java集合类之HashMap原理小结_hashtable不使用的原因?-程序员宅基地

文章浏览阅读138次。1. 认识HashMapHashMap是用来存储key-value键值对的数据结构。当我们创建HashMap的时候,如果不指定任何参数,它会为我们创建一个初始容量为16,负载因子为0.75的HashMap (load factor,记录数/数组长度)。当loadFactor达到0.75或指定值的时候,HashMap的总容量自动扩展一倍。它的底层采用Entry数组来保存所有的key-val..._hashtable不使用的原因?

layui表格全英文,跳页部分_laypage中英文切换-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏6次。因开发要求需要将layui table中的中文组件部分改为英文,其它地方修改layui.js文件即可,但是跳页部分缺没找到对应中文部分一开始想到js二次修改html的方式:var html = document.querySelectorAll('.layui-laypage-skip'); html[0].innerHTML = 'Page<input type="text" min="1" value="1" class="layui-input"><bu_laypage中英文切换

Ubuntu18.04安装教程——超详细的图文教程_ubuntu18.04安装教程——超详细的图文教程_ubuntu18.04安装教程——超详细的图文-程序员宅基地

文章浏览阅读10w+次,点赞109次,收藏964次。Ubuntu18.04镜像_ubuntu18.04安装教程——超详细的图文教程_ubuntu18.04安装教程——超详细的图文

如何用命令行运行脚本_脚本运行命令行方式怎么运行-程序员宅基地

文章浏览阅读1.5k次。如何用命令行运行脚本How to run python scripts on CMDC:…> 是windows提供的命令行模式,>>> python的交互式环境下。在命令行模式下可以执行Python进入python交互式环境,也可以执行 python “地址”\name.py 运行一个 .py脚本文件。..._脚本运行命令行方式怎么运行

java多线程之AtomicLong原子类(JDK8)_java atomiclong-程序员宅基地

文章浏览阅读1k次,点赞5次,收藏7次。引言有的同学可能会问这个问题,有了Long类型,为什么还要弄一个AtomicLong类出来?因为在32位的操作系统中,64位的Long类型变量会被jvm拆分为两个32位的来操作,因此不具备原子性。而AtomicLong类型可以保证原子性。1、AtomicLong介绍AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似。本章以J..._java atomiclong

推荐文章

热门文章

相关标签