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();
}
相关推荐
夜猫逐梦6 小时前
【Lua】Windows 下编写 C 扩展模块:VS 编译与 Lua 调用全流程
c语言·windows·lua
java搬砖工-苤-初心不变10 小时前
OpenResty 配合 Lua 脚本的使用
开发语言·lua·openresty
半夏知半秋2 天前
基于跳跃表的zset实现解析(lua版)
服务器·开发语言·redis·学习·lua
不要再敲了2 天前
掌握单元测试的利器:JUnit 注解从入门到精通
junit·单元测试
Wyc724092 天前
Lua语言基础笔记
开发语言·笔记·lua
山楂树下懒猴子4 天前
ChatAI项目-ChatGPT-SDK组件工程
人工智能·chatgpt·junit·https·log4j·intellij-idea·mybatis
锐策4 天前
Lua 核心知识点详解
开发语言·lua
lanhuazui104 天前
lua中 string.match返回值
lua
无名客04 天前
redis分布式锁为什么采用Lua脚本实现。而不是事务
redis·分布式·lua·事务
我发在否6 天前
Lua > OpenResty HelloWorld
lua·openresty