源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2020-11-24 13:39 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:C++遍历Lua table的方法实例
[b]Lua table数据如下:[/b] [img]http://files.jb51.net/file_images/article/201504/2015423110743394.png?201532311752[/img]
[u]复制代码[/u] 代码如下:
--$ cat test.lua lua文件 user = {         ["name"] = "zhangsan",         ["age"] = "22",         ["friend"] = {                 [1] = {                     ["name"] = "小丽",                     ["sex"] = "女",                     ["age"] = "20",                 },                 [2] = {                     ["name"] = "小罗",                     ["sex"] = "男",                     ["age"] = "20",                 },             },         }
[b]要读出上面table 中所有数据,C++代码如下:[/b]
[u]复制代码[/u] 代码如下:
//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; }
[b]运行结果:[/b]
[u]复制代码[/u] 代码如下:
$ ./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:小丽
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部