MasterGH Опубликовано 19 июня, 2011 Поделиться Опубликовано 19 июня, 2011 Я продолжаю писать код на LUA для генерации трейнеров. Мне понадобилось сохранение пользовательских параметров и восстановление их при следующем запуске Lua файлов CE. Естественно, я не хотел писать то, что возможно уже написано (ссылка)Для начала мини тутор:ini_table = {}ini_table["n"] = {}ini_table["n"]["n"] = {}ini_table["n"]["n"]["n"] = 10for 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 endend-- Вывод:-- n 10Если не поняли, то обращаемся к докоментации LUA. Данный приём позволит вывести ключи и значения. Именно этот приём позволит прочитать значения ini - файла. Давайте попробуем создать файл some.ini по пути логического диска D. У вас может быть другой путь.[Section1]s1_KEY=Value[sect2]s1_KEY=Values1_KEY=Value2В консоли LUA Engine попытаемся вывести значения из файла. return string.format ("%s: %s:%d: %s", msg, filename, line_counter, line)endfunction 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_tableendfunction 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 trueendnriu, err = get("D:\\some.ini")if (riu == nil) then print(err)elsefor k,v in pairs(nriu) do for k1,v1 in pairs(v) do for k2,v2 in pairs(v1) do print(k2,v2) end endendendlocal function make_err (msg, filename, line_counter, line) Таким образом получим ответ:Value2 Value Value Если вам нужны названия секций, а также запись в файл ini, то думаю уже сами разберётесь.Я собираюсь использовать файл ini для настроек LUA трейнера. В частности поддержка перводов на различных языках, пользовательское установленное имя процесса, хранение адресов сигнатур и т.п. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения