Перейти к содержанию

Чтение, запись параметров в ini-файл


MasterGH

Рекомендуемые сообщения

Я продолжаю писать код на LUA для генерации трейнеров. Мне понадобилось сохранение пользовательских параметров и восстановление их при следующем запуске Lua файлов CE. Естественно, я не хотел писать то, что возможно уже написано (ссылка)

Для начала мини тутор:

ini_table = {}
ini_table["n"] = {}
ini_table["n"]["n"] = {}
ini_table["n"]["n"]["n"] = 10

for k,v in pairs(ini_table) do
for k1,v1 in pairs(v) do
for k2,v2 in pairs(v1) do
print(k2,v2)
end
end
end

-- Вывод:
-- n 10

Если не поняли, то обращаемся к докоментации LUA. Данный приём позволит вывести ключи и значения. Именно этот приём позволит прочитать значения ini - файла. Давайте попробуем создать файл some.ini по пути логического диска D. У вас может быть другой путь.

[Section1]
s1_KEY=Value
[sect2]
s1_KEY=Value
s1_KEY=Value2

В консоли LUA Engine попытаемся вывести значения из файла.


return string.format ("%s: %s:%d: %s", msg, filename, line_counter, line)
end

function get(filename) --> (ini_table) or (nil,err)
local f = io.open(filename,'r')
if not f then return nil, "cannot open file: " .. filename end
local line_counter=0
local ini_table = {}
local section, err
for fline in f:lines() do
--set counter for indicate on error
line_counter=line_counter+1
--clean for begin and end spaces
local line = fline:match("^%s*(.-)%s*{:content:}quot;)
--coments
if not line:match("^[%;#]") and #line > 0 then
--section
local sec = line:match("^%[([%w%s]*)%]{:content:}quot;)
if sec then
section = sec
if not ini_table[section] then ini_table[section]={} end
else
--parse key=value and clean for begin and end spaces
local key, value = line:match("([^=]*)%=(.*)")
--check on errors in ini-file
if not key then
err = make_err('key/value absent', filename, line_counter, fline)
break
end
--clean for begin and end spaces
key = key:match("^%s*(%S*)%s*{:content:}quot;)
value = value:match("^%s*(.-)%s*{:content:}quot;)
if not (key and value) then
err = make_err('bad key or value', filename, line_counter, fline)
break
end
if section then
if not ini_table[section][key] then ini_table[section][key]={} end
ini_table[section][key][value] = true
else
err = make_err('key/value outside a section', filename, line_counter, fline)
break
end
end
end
end
f:close()
if err then return nil, err end
return ini_table
end


function set(ini_table, filename)
f = io.open(filename,'w')
if not f then return nil, "cannot open file: " .. filename end
f:write('; Created by inilazy (http://luaforge.net/projects/inilazy/)\n\n')
for secname, sec in pairs(ini_table) do
f:write("[", secname, "]\n")
for keyname, key in pairs(sec) do
for value, _ in pairs(key) do
f:write(keyname, "=", value, "\n")
end
end
f:write "\n"
end
f:close()
return true
end

nriu, err = get("D:\\some.ini")
if (riu == nil) then
print(err)
else
for k,v in pairs(nriu) do
for k1,v1 in pairs(v) do
for k2,v2 in pairs(v1) do
print(k2,v2)
end
end
end

end
local function make_err (msg, filename, line_counter, line)

Таким образом получим ответ:


Value2
Value
Value  

Если вам нужны названия секций, а также запись в файл ini, то думаю уже сами разберётесь.

Я собираюсь использовать файл ini для настроек LUA трейнера.

post-3-1308501658,62_thumb.png

В частности поддержка перводов на различных языках, пользовательское установленное имя процесса, хранение адресов сигнатур и т.п.

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.