C++遍历Lua table的方法实例_Lua

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:小丽

时间: 2024-09-24 22:35:39

C++遍历Lua table的方法实例_Lua的相关文章

Lua中table库函数方法介绍_Lua

一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明. table.concat(table, sep,  start, end) concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开.除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认

Lua中使用元表(metatable)执行算术类元方法实例_Lua

上一节对元表和元方法有了一个初步的认识,这篇就来举个最简单的例子吧,加深一下印象,也为后续内容做准备. 1.元方法名 Lua其实已经规定好了各种算术操作符的元方法名字,如: __add:加法 __sub:减法 __mul:乘法 __div:除法 __unm:相反数 __mod:取模 __pow:乘幂   只要在自定义元表的时候,给这些元方法名赋予新的函数就可以实现自定义操作了. 2.例子 开始举例吧,我们新建一个自定义的元表(也就是一个table变量),用来定义一些操作: 复制代码 代码如下:

获取Lua表结构(table)数据实例_Lua

只是获取一个全局变量什么的太没意思了,今天我们来玩个高难度的--获取Lua表结构的数据. (旁白:O O!我是不是该说点什么?) 上一章传送门:http://www.jb51.net/article/55093.htm 1. 什么是table table是Lua里最强大的数据类型,我们可以当成是数组,但是它又和数组有点不一样,建议大家看看Lua的语法教程,因为我对table也没有熟悉到可以给大家解释的程度. (旁白:那你还写什么教程...) 2. 获取table变量 现在,我们给helloLua

Linux下编写Lua扩展so文件和调用方法实例_Lua

复制代码 代码如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <errno.h> #include <string.h>   #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> #include <limits.h>   #include

Lua 操作 MongoDB 数据库实例_Lua

最近有个工作是使用Nginx + Lua实现一个操作MongoDB数据库的API,主要实现其count和query功能.之前没有写过Lua,于是也就勉强着上手,在cloudwu的 lua-mongo 的基础上实现了操作MongoDB的API. cloudwu的lua-mongo驱动实现了连接Mongo,进行find和findOne等基本操作的功能,所以在lua-mongo的基础上增加了count和query等方法.修改的具体内容如下: 1.API基于luajit-2.0开发,相当于lua 5.1

c++遍历lua table示例_C 语言

c/c++从栈上获取Lua压栈过来的table数据 复制代码 代码如下: map<string,string> traverse_table(lua_State *L, int index){ map<string,string> data;    lua_pushnil(L);     // 现在的栈:-1 => nil; index => table index = index - 1;    while (lua_next(L, index))    {     

Lua table类型学习笔记_Lua

关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中,数组的内容只允许一种类型:在 Lua中,你也可以用任意类型的值来作数组的内容,nil也可以. 基本介绍 注意三点: 第一,所有元素之间,总是用逗号 "," 隔开: 第二,所有索引值都需要用 "["和"]" 括起来:如果是字符串,还可以去掉引号和中括

Lua UnPack函数用法实例_Lua

unpack它接受一个数组(table)作为参数,并默认从下标1开始返回数组的所有元素,例子代码如下: 复制代码 代码如下: do  arrayData = {"a", "b", "c", "d", "e"};  function returnMoreValues()   return 1, 2, 3;  end  a, b, c = returnMoreValues();  --print(a, b, c

lua操作excel方法分享_Lua

通过luacom操作excel.网上提供的资料很少,我模仿vba找出了一些基本操作方法. 复制代码 代码如下: require 'luacom' local excel = luacom.CreateObject('Excel.Application') excel.Visible = true local book = excel.Workbooks:Add() local sheet = book.Worksheets(1) sheet.Name = 'gty' local range =