c++ 遍历lua table方法

来源:互联网 发布:数据库原理视频教程 编辑:程序博客网 时间:2024/05/20 22:28
//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;}

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;}


0 0
原创粉丝点击