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();
}
相关推荐
千里镜宵烛16 小时前
深入 Lua 元表与元方法
junit
l1t1 天前
luadbi和luasql两种lua duckdb驱动的性能对比
开发语言·单元测试·lua·c·csv·duckdb
l1t2 天前
利用DeepSeek辅助修改luadbi-duckdb读取DuckDB decimal数据类型
c语言·数据库·单元测试·lua·duckdb
Mr. zhihao2 天前
Java 反序列化中的 boolean vs Boolean 陷阱:一个真实的 Bug 修复案例
java·bug·lua
ellis19702 天前
Lua代码混淆-Prometheus方案教程
unity·lua
安冬的码畜日常2 天前
【JUnit实战3_26】第十五章:表现层测试(下)—— Selenium 在网页测试中的用法
selenium·测试工具·junit·gui测试·junit5·表现层测试
烛阴3 天前
从create到yield:Lua协程完全上手指南
前端·lua
利来利往3 天前
lua table.remove引发的偶现bug
bug·lua·table.remove
初见无风3 天前
3.1 Lua代码中的元表与元方法
开发语言·lua·lua5.4
千里镜宵烛3 天前
Lua--数据文件和持久性
开发语言·junit·lua