lua配置文件保存

lua配置文件保存题记:最近做项目,使用到了lua配置文件,据说,这玩意儿非常强大,特别是在游戏领域,大受欢迎。项目里的一些配置项,需要常常修改,个人不想进入配置文件里里修改,而想通过命令行的参数,直接读入配置项参数,然后保存至配置文件里。一直在想用什么方式,来解决这个问题,最先想到的是用C++的读写方式,但是遇到了一个文本格式不兼容的问题,没能实现。后面想用lua这个语言来解决这个问题,然

题记:最近做项目,使用到了lua配置文件,据说,这玩意儿非常强大,特别是在游戏领域,大受欢迎。
项目里的一些配置项,需要常常修改,个人不想进入配置文件里里修改,而想通过命令行的参数,直接读入配置项参数,然后保存至配置文件里。
一直在想用什么方式,来解决这个问题,最先想到的是用C++的读写方式,但是遇到了一个文本格式不兼容的问题,没能实现。后面想用lua这个语言来解决这个问题,然后就解决了这个问题,虽然解决的很笨,但也不失为一种办法。记录如下:
开始是准备用网上找到的一个代码链接为:
http://see.sl088.com/wiki/Lua_SaveTableToFile
这里给它注释一下:

“`
–[[
Save Table to File
Load Table from File
v 1.0

Lua 5.2 compatible

Only Saves Tables, Numbers and Strings
Insides Table References are saved
Does not save Userdata, Metatables, Functions and indices of these
----------------------------------------------------
table.save( table , filename )

on failure: returns an error msg

----------------------------------------------------
table.load( filename or stringtable )

Loads a table that has been saved via the table.save function

on success: returns a previously saved table
on failure: returns as second argument an error msg
----------------------------------------------------

Licensed under the same terms as Lua itself.

]]–
– 前面一大部分是注释

do
– declare local variables
–// exportstring( string )
–// returns a “Lua” portable version of the string
local function exportstring( s ) –定义一个函数exportstring()
return string.format(“%q”, s) –输出lua格式的字符串,%q的意思,lua格式的字符串
end

--// The Save Function
function table.save(  tbl,filename )
    local charS,charE = "   ","\n"  --定义了一个tab和一个换行变量
    local file,err = io.open( filename, "wb" ) --以写方式打开一个文件
    if err then return err end  --如果打开失败,退出

    -- initiate variables for save procedure
    local tables,lookup = { tbl },{ [tbl] = 1 }  --初始化两个变量table变量,注意lookup这个table的key为tbl,vulue为1
    file:write( "return {"..charE ) --保存一个return{和一个换行符

    for idx,t in ipairs( tables ) do  --遍历tables,只遍历key为数字的项
        file:write( "-- Table: {"..idx.."}"..charE ) --..两点符号表示字符串连接符号
        file:write( "{"..charE )
        local thandled = {}  --定义了一个空table

        for i,v in ipairs( t ) do --遍历t中key为数字的项
            thandled[i] = true --填充thandled,key为i,vulue为true,它的意思为第i个key为数字的项目
            local stype = type( v ) --获取value的类型
            -- only handle value 处理value
            if stype == "table" then,注意这里ipairs只能遍历key为数字的项,因而等号左边为字符串的,将不被遍历
                if not lookup[v] then  --如果lookup[v]的value为空nil,则给tables插入一个key为v的项
                    table.insert( tables, v )
                    lookup[v] = #tables --存储key为v,value为tables的长度
                end
                file:write( charS.."{"..lookup[v].."},"..charE )
            elseif stype == "string" then --key为字符串
                file:write(  charS..exportstring( v )..","..charE )
            elseif stype == "number" then --key为数字
                file:write(  charS..tostring( v )..","..charE )
            end
        end

        for i,v in pairs( t ) do --遍历所有的key项,说明的是这里的循环与上面的循环平行,下面的意思与上一样,所以不再说明
            -- escape handled values
            if (not thandled[i]) then  --如果thandled[i]为空

                local str = ""
                local stype = type( i )
                -- handle index 处理key
                if stype == "table" then
                    if not lookup[i] then
                        table.insert( tables,i )
                        lookup[i] = #tables
                    end
                    str = charS.."[{"..lookup[i].."}]="
                elseif stype == "string" then
                    str = charS.."["..exportstring( i ).."]="
                elseif stype == "number" then
                    str = charS.."["..tostring( i ).."]="
                end

                if str ~= "" then
                    stype = type( v )
                    -- handle value
                    if stype == "table" then
                        if not lookup[v] then
                            table.insert( tables,v )
                            lookup[v] = #tables
                        end
                        file:write( str.."{"..lookup[v].."},"..charE )
                    elseif stype == "string" then
                        file:write( str..exportstring( v )..","..charE )
                    elseif stype == "number" then
                        file:write( str..tostring( v )..","..charE )
                    end
                end
            end
        end
        file:write( "},"..charE )
    end
    file:write( "}" )
    file:close()
end

--// The Load Function
function table.load( sfile )
    local ftables,err = loadfile( sfile )
    if err then return _,err end
    local tables = ftables()
    for idx = 1,#tables do
        local tolinki = {}
        for i,v in pairs( tables[idx] ) do
            if type( v ) == "table" then
                tables[idx][i] = tables[v[1]]
            end
            if type( i ) == "table" and tables[i[1]] then
                table.insert( tolinki,{ i,tables[i[1]] } )
            end
        end
        -- link indices
        for _,v in ipairs( tolinki ) do
            tables[idx][v[2]],tables[idx][v[1]] =  tables[idx][v[1]],nil
        end
    end
    return tables[1]
end

– close do
end

– ChillCode

测试代码
SAVEFILE=”daimao.moe”

print “———–测试写入”
print “开始写入….写入数据:”
daimao={name=”cat”,age=2,body={eyes=”green”,mouth=”big”}}
table.foreach(daimao,print)
print “开始保存数据”
table.save(daimao,”daimao.moe”)
print “保存数据完毕”

print “———–测试读取”
daimao2={}
daimao2=table.load(SAVEFILE)
table.foreach(daimao2,print)
–为了体现这是一个tutorial的精神,详细记录:
–1)新建一个文件夹,该文件夹下,新建两个文件:一个ceshi.lua,一个daimao.moe
–2)打开ceshi.lua文件,第一行输入:#!/usr/bin/lua
–3)拷贝上述两部分的代码到文件里保存
–4)sudo chmod 777 ceshi.lua
–5)cd lua
–6)./ceshi.lua
–7)打开daimao.moe
–8)将看到保存的文件
–但是,这里保存的文件格式,不是我所需要的格式
–这里介绍一个去掉双引号的函数:
local function deleteQuotation(s)
ss=string.format(“%q”,s)
a,b,part1=string.find(ss,’([“].*[“])’) –核心函数,a表示第一个双引号的位置,b表示第二个双引号的位置,part1带双引号的项
local part2=string.sub(part1,2,b-a) – 从part1里的第2 到递增到b-a之间提取一段字符,闭区间
return part2
end
abc=”abcd”
print(deleteQuotation(abc))
先写到这里

今天的文章lua配置文件保存分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/11170.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注