当前位置 博文首页 > C++遍历Lua table的方法实例

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

    作者:admin 时间:2021-02-08 15:21

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

    js