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();
}
相关推荐
闪电悠米17 小时前
黑马点评-秒杀优化-02_lua_precheck
开发语言·redis·分布式·缓存·junit·wpf·lua
迷藏49417 小时前
双阶段动态权重匹配系统:高效精准的工业级解决方案
java·junit
程序员二叉1 天前
【Redis】 高性能核心:IO多路复用+多线程+Pipeline+Lua脚本(面试终极版)
redis·面试·lua
智能制造产品经理代码提升1 天前
快速搭建PayPal标准API测试框架
开发语言·lua
智能制造产品经理代码提升1 天前
Postman批量CaptureID全自动查询
开发语言·lua
yzx9910132 天前
懒人精灵进阶版
junit
garmin Chen2 天前
Prompt工程入门:让AI按你的要求工作(1)--prompt概述与设计
java·人工智能·python·junit·prompt·agent
xingpanvip3 天前
星盘接口开发文档:马盘次限盘接口指南
android·开发语言·python·php·lua
heimeiyingwang3 天前
【架构实战】权限系统设计:RBAC到ABAC的演进之路
junit·架构
selt7913 天前
Redisson 源码深度分析
java·c++·redis·lua