Сохранение таблиц Lua в файле

Часто возникает необходимость сохранить таблицу Lua в каком-нибудь "надёжном" месте, чтобы впоследствии иметь к ней доступ. Например, при рестарте скрипта. Постановим считать таким надежным местом файл на жестком диске.
Как сохранить?
Стандартные пути: двоичный файл, текстовый фиксированного формата, формат ini, формат xml. В принципе, использовать можно любой на вкус, а для разбора ini и xml есть готовые расширения Lua.
Я решил использовать другой, гораздо более удобный способ. Сохранить в файле в подавляющем случае требуется некую структуру данных. Для Lua это таблица. На сохранение и восстановление таблицы из файла и будем ориентироваться.
Используем преобразование таблицы в текстовое представление и сохраняем на диске результаты.
-- Сохранение таблицы или массива в файл
function table.save(tbl,filename)
local f,err = io.open(filename,"w")
if not f then
return nil,err
end
f:write(table.tostring(tbl))
f:close()
return true
end
В результате на диске мы получим файл, в котором в терминах синтаксика языка Lua описана наша таблица. Зачем сохранять в синтаксисе Lua? Причин две:
- универсальность
- элегантный способ чтения таблицы из файла
Вот функция, читающая файл и возвращающая сохранённую в нем таблицу:
-- Чтение таблицы из файла в массива или таблицу
function table.read(filename)
local f,err = io.open(filename,"r")
if not f then
return nil,err
end
local tbl = assert(loadstring("return " .. f:read("*a")))
f:close()
return tbl()
end
Все просто - читаем файл и запускаем его на выполнение
Вот как это выглядит:
table.save({11,22,33,{"gh",'jk'},44},"e:\\1.dat") -- пишем t = table.read("e:\\1.dat") -- читаем
Аналогичная пара функций для qpile: Файловые операции с массивами и коллекциями