Lua 如何读写ini文件

常见的配置文件通常使用ini文件来存储,读写ini文件的方式也有很多。本文想要实现的是:ini文件的读写由Lua实现,C只负责调用Lua来实现ini文件的读写功能。那么如何在C代码中调用Lua来实现ini文件的读写?

ini.lua

cpp 复制代码
--LoadIniFile
function LoadIniFile(fileName)
    assert(type(fileName) == 'string', 'Parameter "fileName" must be a string.');
    local file = assert(io.open(fileName, 'r'), 'Error loading file : ' .. fileName);
    local data = {};
    local section;
    for line in file:lines() do
        local tempSection = line:match('^%[([^%[%]]+)%]$');
        if(tempSection)then
            section = tonumber(tempSection) and tonumber(tempSection) or tempSection;
            data[section] = data[section] or {};
        end
        local param, value = line:match('^([%w|_]+)%s-=%s-(.+)$');
        if(param and value ~= nil)then
            if(tonumber(value))then
                value = tonumber(value);
            elseif(value == 'true')then
                value = true;
            elseif(value == 'false')then
                value = false;
            end
            if(tonumber(param))then
                param = tonumber(param);
            end
            data[section][param] = value;
        end
    end
    file:close();
    return data;
end

--SaveIniFile
function SaveIniFile(fileName, data)
    assert(type(fileName) == 'string', 'Parameter "fileName" must be a string.');
    assert(type(data) == 'table', 'Parameter "data" must be a table.');
    local file = assert(io.open(fileName, 'w+b'), 'Error loading file :' .. fileName);
    if file then
        local contents = '';
        for section, param in pairs(data) do
            contents = contents .. ('[%s]\n'):format(section);
            for key, value in pairs(param) do
                contents = contents .. ('%s=%s\n'):format(key, tostring(value));
            end
            contents = contents .. '\n';
        end
        file:write(contents);
        file:close();
        return true
    else
        return false
    end
end

--ReadIni
function ReadIni(IniPath, Section, Key)
    local data = LoadIniFile(IniPath)
    return data[Section][Key]
end

--WriteIni
function WriteIni(IniPath, Section, Key, Value)
    local data = LoadIniFile(IniPath)
    data[Section][Key] = Value
    save(IniPath, data)
end

--初始化Ini文件
function InitFile()
    local config = {
        ["section1"] = {
            key1 = "val1",
            key2 = "val2"
        },
        ["section2"] = {
            key3 = "val3",
            key4 = "val4"
        }
    }
    if SaveIniFile("./config.ini", config) then
        print("write ini success")
    else
        print("write ini failed")
    end
end

InitFile()

C++调用ini.lua实现配置文件读写

cpp 复制代码
#include <QCoreApplication>
#include <stdio.h>
extern "C"{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}

lua_State *L;
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    printf("started\r\n");

    L =  luaL_newstate();//新建lua解释器
    luaL_openlibs(L);//载入lua基础库

#if 1
    /* 通过lua读写ini文件 */
    luaL_dofile(L, "lua/ini.lua");

    /* 执行Lua脚本中的函数 */
    lua_getglobal(L, "ReadIni");
    lua_pushstring(L, "./config.ini");
    lua_pushstring(L, "section1");
    lua_pushstring(L, "key1");
    //
    lua_call(L, 3, 1);
    auto result = lua_tostring(L,-1);//-1表示最后一个返回值,因为lua的函数可以返回多个值
    printf("result=%s\n", result);
    //
    lua_pop(L, 1);
#endif

    /*cleanup Lua*/
    lua_close(L);

    system("pause");
    return a.exec();
}
相关推荐
姓蔡小朋友13 小时前
LUA脚本
开发语言·junit·lua
金融新世界16 小时前
推动产业升级:倒逼转型创新与重构产业链格局
lua
oMcLin18 小时前
如何在 Debian 11 上配置并优化 Nginx 与 Lua 脚本,提升高并发网站的动态请求处理能力?
nginx·debian·lua
源代码•宸20 小时前
goframe框架签到系统项目开发(补签逻辑实现、编写Lua脚本实现断签提醒功能、简历示例)
数据库·后端·中间件·go·lua·跨域·refreshtoken
每天回答3个问题21 小时前
Lua 函数教程
开发语言·ue5·ue4·lua
星空露珠2 天前
时间罗盘小界面模组
开发语言·数据结构·算法·游戏·lua
fredricen2 天前
Openwrt21.02应用日志全局开关控制
lua·openwrt·luci
每天回答3个问题2 天前
Lua Table(表)
开发语言·ue4·lua·虚幻引擎
Kang.Charles2 天前
Lua创建Class
开发语言·lua
星空露珠2 天前
2048小游戏制作程序
开发语言·数据库·算法·游戏·lua