C++遍历Lua table的方法实例
技术  /  管理员 发布于 5年前   523
Lua table数据如下:
复制代码 代码如下:
--$ cat test.lua lua文件
user = {
["name"] = "zhangsan",
["age"] = "22",
["friend"] = {
[1] = {
["name"] = "小丽",
["sex"] = "女",
["age"] = "20",
},
[2] = {
["name"] = "小罗",
["sex"] = "男",
["age"] = "20",
},
},
}
要读出上面table 中所有数据,C++代码如下:
复制代码 代码如下:
//C++代码:
#include <lua.hpp>
#include <iostream>
#include <string>
using namespace std;
bool popTable(lua_State* L, int idx)
{
try{
lua_pushnil(L);
while(lua_next(L, idx) != 0){
int keyType = lua_type(L, -2);
if(keyType == LUA_TNUMBER){
double value = lua_tonumber(L, -2);
cout << "Key:" << value << endl;
}else if(keyType == LUA_TSTRING){
const char* value = lua_tostring(L, -2);
cout << "Key:" << value << endl;
}else{
cout << "Invalid key type: " << keyType << endl;
return false;
}
int valueType = lua_type(L, -1);
switch(valueType){
case LUA_TNIL:
{
cout << "Value: nil" << endl;
break;
}
case LUA_TBOOLEAN:
{
int value = lua_toboolean(L, -1);
cout << value << endl;
break;
}
case LUA_TNUMBER:
{ cout << "Value:" << lua_tonumber(L, -1) << endl;
break;
}
case LUA_TSTRING:
{
cout << "Value:" << lua_tostring(L, -1) << endl;
break;
}
case LUA_TTABLE:
{
cout << "====sub table===" << endl;
int index = lua_gettop(L);
if (!popTable(L, index)) {
cout << "popTable error in popTable,error occured" << endl;
return false;
}
break;
}
default:
{
cout << "Invalid value type: " << valueType << endl;
return false;
}
}
lua_pop(L, 1);
}
}catch(const char* s){
string errMsg = s;
lua_pop(L,1);
cout << errMsg << endl;
return false;
}catch(std::exception& e){
const char* errMsg = e.what();
lua_pop(L,1);
cout << errMsg << endl;
return false;
}catch(...){
const char* errMsg = lua_tostring(L,-1);
lua_pop(L,1);
cout << errMsg << endl;
return false;
}
return true;
}
int main(int argc, char* argv)
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
int r = luaL_dofile(L,"./test.lua");
lua_getglobal(L, "user");
int type = lua_type(L,1);
if(type == LUA_TTABLE){
int index = lua_gettop(L);
if(popTable(L,index)){
return 0;
}else{
cout << "Error" << endl;
return -1;
}
}
return 0;
}
运行结果:
复制代码 代码如下:
$ ./cpptable.linux_64_gcc4
Key:age
Value:22
Key:name
Value:zhangsan
Key:friend
====sub table===
Key:2
====sub table===
Key:sex
Value:男
Key:age
Value:20
Key:name
Value:小罗
Key:1
====sub table===
Key:sex
Value:女
Key:age
Value:20
Key:name
Value:小丽
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号