一、内容介绍

把lua作为配置文件,里面的参数值的获取,在他人基础上做了修改,并且补充了一维数组的处理方式。

若有不足之处请多多指教。

对于二维数组,没有成功。希望大家继续补充和修改,非常感谢!

二、Lua配置文件

配置文件名称为test_read.lua 。

文件内容为:

width = 10
height = 3
title = "this is a test"
array = {r = 2,g = 3,b = 4}
array_1d = {2,5,26,8}
array_2d = {{2,5},{15,18},{25,26,28},{0,5,4}}

三、解析类头文件

对于lua单个对象解析,我在其他人基础上进一步的完善了类。

做成了一个头文件,文件名称为lua_parser.h,类名称为:lua_parser.

头文件内容为:

#ifndef _rw_lua_parser_h__
#define _rw_lua_parser_h__ #include <string>
using namespace std;
#define luac_c
#define LUA_CORE
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
#pragma comment(lib,"lua5.2.3.lib") class lua_parser
{
public:
lua_parser(void)
{
l_state = luaL_newstate();
luaL_openlibs(l_state);
} virtual ~lua_parser(void)
{
lua_close(l_state);
} bool load_file(string str)
{
if(luaL_dofile(l_state, str.c_str())){
return false;
}
return true;
} string load_string(string str)
{
lua_getglobal(l_state, str.c_str());
if (lua_isstring(l_state, -1))
{
return (string)lua_tostring(l_state, -1);
}
return "";
} int load_integer(string str)
{
lua_getglobal(l_state, str.c_str());
if (lua_isnumber(l_state, -1))
{
return (int)lua_tointeger(l_state, -1);
}
return -1;
} double load_double(string str)
{
lua_getglobal(l_state, str.c_str());
if (lua_isnumber(l_state, -1))
{
return (double)lua_tonumber(l_state, -1);
}
return 0.0;
} bool load_boolean(string str)
{
lua_getglobal(l_state, str.c_str());
if (lua_isboolean(l_state, -1))
{
return (bool)(lua_toboolean(l_state, -1) != 0 ? true:false);
}
return false;
} bool load_map(const char* name_,const int number_,string str_[],double array_list[],int type_ = 0)
{
if (number_ <= 0){
return false;
} lua_getglobal(l_state,name_);
if (!lua_istable(l_state,-1)){
std::cout<<"input is not a table"<<std::endl;
goto funcend;
}
if (type_ == 0)
{
for (int i =0;i < number_;i++)
{
lua_getfield(l_state,-1,str_[i].c_str());
array_list[i] = (double)lua_tonumber(l_state,-1);
lua_pop(l_state,1);
}
}
else
{
for (int i =0;i < number_;i++)
{
lua_getfield(l_state,-1,str_[i].c_str());
array_list[i] = (int)lua_tointeger(l_state,-1);
lua_pop(l_state,1);
}
}
funcend:
return true;
} bool load_array(const char* name_,int*& array_)
{
if (NULL == name_ ){
return false;
} lua_getglobal(l_state,name_);
if (!lua_istable(l_state,-1)){
std::cout<<"array is not a table"<<std::endl;
}
int top_index = lua_gettop(l_state);
lua_len(l_state,top_index);
int size_arary = lua_tointeger(l_state, -1);
array_ = new int[size_arary]; int i = 0;
lua_pushnil(l_state);
while (lua_next(l_state, top_index))
{
int it_idx = lua_gettop(l_state);
array_[i] = lua_tointeger(l_state, -1);
i++;
lua_pop(l_state, 1);
}
return true;
} bool load_array(const char* name_,double*& array_)
{
if (NULL == name_ ){
return false;
} lua_getglobal(l_state,name_);
if (!lua_istable(l_state,-1)){
std::cout<<"array is not a table"<<std::endl;
}
int top_index = lua_gettop(l_state);
lua_len(l_state,top_index);
int size_arary = lua_tointeger(l_state, -1);
array_ = new double[size_arary]; int i = 0;
lua_pushnil(l_state);
while (lua_next(l_state, top_index))
{
int it_idx = lua_gettop(l_state);
array_[i] = lua_tonumber(l_state, -1);
i++;
lua_pop(l_state, 1);
}
return true;
}
private:
lua_State* l_state;
}; #endif

内容还是算清晰的吧!基本代码自解释。所以不说了。

但是头文件还是需要lua的lib和dll库的。这些是基本的。

四、测试代码

测试代码主要一个main函数。

测试代码:

int main()
{
//lua_State * L = luaL_newstate();
//luaL_openlibs(L);
// read config file
/*int w = 0 , h = 0;*/
//load_ui_conf(L,"test_read.lua",&w, & h);
//lua_close(L); int w = 0 , h = 0;
// number
lua_parser _lua_parser;
_lua_parser.load_file("test_read.lua");
w = _lua_parser.load_integer("width");
h = _lua_parser.load_double("height");
cout<<"width = "<<w<< ",height ="<<h<<endl;
cout<<"get as number is ok"<<endl; // string
string title = _lua_parser.load_string("title");
cout<<"the content is :" <<title<<endl;
cout<<"get as string is ok"<<endl; // map
char* name_ = "array";
int number_ = 3;
string str_[3]= {"r","g","b"};
double array_list_[3];
_lua_parser.load_map(name_,number_,str_,array_list_);
cout<<"get as map is ok"<<endl; // array _1
double* array_list_int = NULL;
_lua_parser.load_array("array_1d", array_list_int);
cout<<"get as array is ok"<<endl;
if(NULL != array_list_int)
{
delete []array_list_int;
array_list_int = NULL;
}
// add table and array return 0;
}

五、测试结果

如图:

六、参考:


http://www.360doc.com/content/11/1225/12/1317564_174843428.shtml

http://mobile.51cto.com/iphone-287727.htm

非常感谢!

七、附上测试代码:

//#define luac_c
//#define LUA_CORE
//
//#include "lua.h"
//#include "lauxlib.h"
//#include "lualib.h"
//#pragma comment(lib,"lua5.2.3.lib") // global
void error(lua_State * L ,const char * fmt,...)
{
va_list argp;
va_start(argp,fmt);
vfprintf(stderr,fmt,argp);
va_end(argp);
lua_close(L);
exit(EXIT_FAILURE);
} // read config file
void load_ui_conf(lua_State * L,const char * file_name,int * w,int * h)
{
if(luaL_loadfile(L,file_name) || lua_pcall(L,0,0,0))
{
error(L,"can not run config file: %s",lua_tostring(L,-1));
} lua_getglobal(L,"width");
if(! lua_isnumber(L,-1))
{
error(L,"height should be a number");
}
*w = lua_tointeger(L,-1); lua_getglobal(L,"height");
if(! lua_isnumber(L,-1))
{
error(L,"width should be a number");
}
*h = lua_tointeger(L,-1);
//
//lua_getglobal(L,"array");
//if (!lua_istable(L,-1)){
// std::cout<<"array is not a table"<<std::endl;
//}
//int top_index = lua_gettop(L);
//lua_len(L,top_index);
//int size_arar = lua_tointeger(L, -1);
//int *array_re = new int[size_arar]; lua_getglobal(L,"array");
if (!lua_istable(L,-1)){
std::cout<<"array is not a table"<<std::endl;
}
//int t_idx = lua_gettop(L);
//lua_len(L,t_idx);
//int size_arary = lua_tointeger(L, -1);
int *array_re = new int[3]; lua_getfield(L,-1,"r");
array_re[0] = (int)lua_tonumber(L,-1);
lua_pop(L,1); lua_getfield(L,-1,"g");
array_re[1] = (int)lua_tonumber(L,-1);
lua_pop(L,1);
lua_getfield(L,-1,"b");
array_re[2] = (int)lua_tonumber(L,-1);
lua_pop(L,1); //////
//lua_getglobal(L,"array_1d");
//if (!lua_istable(L,-1)){
// std::cout<<"array is not a table"<<std::endl;
//}
//int t_idx = lua_gettop(L);
//lua_len(L,t_idx);
//int size_arary = lua_tointeger(L, -1);
//int *array_test = new int[size_arary]; //int i = 0;
//lua_pushnil(L);
//while (lua_next(L, t_idx))
//{
// int it_idx = lua_gettop(L);
// printf("%d\n", lua_tointeger(L, -1));
// array_test[i] = lua_tointeger(L, -1);
// i++;
// lua_pop(L, 1);
//}
////
//printf("============================\n");
//
//lua_getglobal(L,"array_2d");
//if (!lua_istable(L,-1)){
// std::cout<<"array is not a table"<<std::endl;
//}
//int t_idx_2 = lua_gettop(L);
//lua_len(L,t_idx_2);
//int size_arary_2d = lua_tointeger(L, -1);
// int **array_test_2d = new int*[size_arary_2d]; //i = 0;
//lua_pushnil(L);
//while (lua_next(L, t_idx_2))
//{
// int it_idx = lua_gettop(L);
// lua_len(L,it_idx);
// int len = lua_tointeger(L, -1);
// array_test_2d[i] = new int[len];
// int j = 0;
// lua_pushnil(L);
//
// while(lua_next(L, it_idx ))
// {
// printf("%d\n", lua_tointeger(L, -1));
// array_test_2d[i][j] = lua_tointeger(L, -1);
// lua_pop(L, 1);
// j++;
// }
// printf("------------\n");
// i++;
// //lua_pop(L, 1);
//}
return;
}
int main()
{
//lua_State * L = luaL_newstate();
//luaL_openlibs(L);
// read config file
/*int w = 0 , h = 0;*/
//load_ui_conf(L,"test_read.lua",&w, & h);
//lua_close(L);
return 0;
}

其中注释掉的内容,有二维数组的处理,目前我还没有测试成功。也请高手指导。

全部代码免分下载:c++读取lua配置类  http://download.csdn.net/detail/cartzhang/7374271

完毕!

若有问题,请随时联系!

非常感谢!

c++读取lua配置基础类的更多相关文章

  1. springboot 读取 yml 配置的几种方式

    前言:在springboot 项目中一般默认的配置文件是application.properties,但是实际项目中我们一般会使用application.yml 文件,下面就介绍一下在springbo ...

  2. DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)

    汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC): ;------------------------------------------------ ;功能: 读取PCI 配 ...

  3. Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms") 使用@ConfigurationProperties读取yml配置

    从spring-boot开始,已经支持yml文件形式的配置,@ConfigurationProperties的大致作用就是通过它可以把properties或者yml配置直接转成对象 @Componen ...

  4. 每日笔记---使用@ConfigurationProperties读取yml配置

    每日笔记---使用@ConfigurationProperties读取yml配置 参考地址  https://www.cnblogs.com/mycs-home/p/8352140.html 1.添加 ...

  5. python 读取consul配置

    自动化通过rcp client调用远端服务接口时,都需要将远端测试服务ip.端口记录在配置文件. 但由于,服务发布或重启会导致ip.端口变动. 以下将通过python-consul 自动去读取cons ...

  6. Springboot(二)-application.yml默认的配置项以及读取自定义配置

    写在前面 ===== spring-boot 版本:2.0.0.RELEASE ===== 读取自定义配置 1.配置文件:sys.properties supply.place=云南 supply.c ...

  7. golang 读取 ini配置信息

      package main //BY: 29295842@qq.com//这个有一定问题   如果配置信息里有中文就不行//[Server] ;MYSQL配置//Server=localhost   ...

  8. 表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这种写法就是把组件嵌套改为配置方式

    表单配置项写法,表单写成JSON数组套对象,一行是一个数组单位,一列是一个对象单位,然后再写一个公共组件读取这个配置,循环加载slot,外层载入slot的自定义部分,比如input select等,这 ...

  9. 使用Viper读取Nacos配置(开源)

    使用Viper读取Nacos配置(开源) 一.前言 目前Viper支持的Remote远程读取配置如 etcd, consul:目前还没有对Nacos进行支持,本文中将开源一个Nacos的Viper支持 ...

随机推荐

  1. jquery源码03 (3184 , 3295) support : 功能检测

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  2. jquery08

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. recyclerview23+出现多个item只显示第一个item的问题

    1.改成21+可以,如果不行,就使用第2或第3个解决方案 2.对每个item的inflate,传入两个参数,第二个参数设置为null,而不是使用3个参数(第二个parent,第三个false) 3.i ...

  4. js实现 导航移入移出效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. BZOJ5332: [Sdoi2018]旧试题(莫比乌斯反演)

    时光匆匆,转眼间又是一年寒暑…… 这是小 Q 同学第二次参加省队选拔赛. 今年,小 Q 痛定思痛,不再冒险偷取试题,而是通过练习旧 试题提升个人实力.可是旧试题太多了,小 Q 没日没夜地做题,却看不到 ...

  6. Java数据传递实验

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 在开发过程中,我们经常会遇到对象传递的问题,有时仅仅传递数据,有时却要实现数据同步:这时,就要分清两 ...

  7. InstallShield详细制作说明(四)

    十.编译打包

  8. ORA-10458: standby database requires recovery

    搭建DG最后一步打开时报错如下:   SQL> alter database open read only; alter database open read only * ERROR at l ...

  9. 洛谷 P2692 覆盖

    P2692 覆盖 题目背景 WSR的学校有B个男生和G个女生都来到一个巨大的操场上扫地. 题目描述 操场可以看成是N 行M 列的方格矩阵,如下图(1)是一个4 行5 列的方格矩阵.每个男生负责打扫一些 ...

  10. 洛谷 P1598 垂直柱状图

    P1598 垂直柱状图 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. ...