C++遍历Lua table的方法实例
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:小丽
相关推荐
SCNUHB 2020-11-10
FellowYourHeart 2020-10-05
思君夜未眠 2020-09-04
jessieHJ 2020-08-19
行吟阁 2020-08-09
表格的现在还是较为常用的一种标签,但不是用来布局,常见处理、显示表格式数据。在HTML网页中,要想创建表格,就需要使用表格相关的标签。<table> <tr> <td>单元格内的文字</td> ...
gufudhn 2020-08-09
末点 2020-08-03
nimeijian 2020-07-30
好记忆也需烂 2020-07-28
zlsdmx 2020-07-05
tomson 2020-07-05
tianqi 2020-07-05
onlykg 2020-07-04