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();
}
相关推荐
kebeiovo1 天前
C++与 Lua的交互
c++·lua
wh_xia_jun2 天前
Apifox 测试项目实操1
开发语言·lua
颖火虫盟主2 天前
Lua 协程:从 API 到底层原理再到 Skynet 架构的完整学习路径
学习·架构·lua
tongluowan0073 天前
Redisson的参数及工作原理
java·redis·lua·分布式锁
上海合宙LuatOS3 天前
Air8000低功耗指南
开发语言·物联网·php·lua
wh_xia_jun3 天前
HttpRunner 编写测试用例
开发语言·lua
乐于分享的阿乐3 天前
【2026最新】Postman新旧版本下载安装+免登录 保姆级教程
测试工具·lua·postman
彭于晏Yan4 天前
自定义注解+Lua脚本实现限流
java·spring boot·后端·lua
测试那点事儿4 天前
API 鉴权三种常用做法:用生活例子讲明白
开发语言·lua·生活
灰子学技术5 天前
Envoy Lua 过滤器功能实现分析
开发语言·lua