题记:最近做项目,使用到了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