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

Lua table数据如下:

C++遍历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:小丽

相关推荐