Перейти к содержимому
  • 0
stripwire

Загрузка таблицы из файла

Вопрос

могу ли я сделать так?

t = {}

t = io.read(имя файла)

 

 

если нет, то как можно присвоить таблице значения из файла?

 

 

p.s.  только учу lua, практики 0 ._.

 

 

 

 

и как можно поменять ник? а то при регистрации буквы чуть перепутал[

Изменено пользователем striwpire

Поделиться сообщением


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

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

то есть str_data менять не надо, а путь при сохранении/загрузке он сам находит?

[...]

так? [прост странно, что путь не надо писать ._., и куда тогда он будет сейвить?]

Перечитайте пост Алекса, в конце концов. Там же чёрным по белому написано, что выхлоп serialization.serialize нужно потом сохранить в файл.

 

Писатель

local srl = require("serialization")
local tbl = {
  test = 5,
  hey = {
    [5] = 42,
    ["hello, world"] = "goodbye"
  }
}
local serialized = srl.serialize(tbl)
 
local path = "/tmp/test"
local file = io.open(path, "w")
file:write(serialized)
file:close()

Читатель

local srl = require("serialization")
 
local path = "/tmp/test"
local file = io.open(path, "r")
local serialized = file:read("*a")
file:close()
 
local tbl = srl.unserialize(serialized)
print(tbl.test, tbl.hey[5], tbl.hey["hello, world"], srl.serialize(tbl))

P. S. Над полем текста, оказывается, есть кнопочки форматирования. Зачем кидать сырой код, когда есть кнопка для кода: code.png?

Изменено пользователем Fingercomp

Поделиться сообщением


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

local tab = {}

 

tab = loadfile(имя файла)()

 

В файле

 

return {...}

Поделиться сообщением


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

спс

а если таблицу буду сохранять вот так:

io.open(addres,'w')
io.write(tbl)
io.close()
потом она нормально загрузится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
потом она нормально загрузится?

 

нет.

можно попробовать данные сериализовать

serialization = require('serialization')
str_data = serialization.serialize(table)  -- строка

записать их в виде стринга в файл, а потом при необходимости считать и десериализовать

table = serialization.unserialize (str_data)  -- таблица

по идее должно работать.

 

А лучше, наверно, использовать библиотеку json

 

Также поищи на форуме в библиотеках и программах что-то про "запись данных и конфигурационных параметров  в файл". Там хорошие были библиотечки для хранения массивов данных в файлах и их извлечения.

Поделиться сообщением


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

local filesystem = require("filesystem")

---------------------------------------------------------------------

function table.unserialize(serializedString)
  checkArg(1, serializedString, "string")
  local success, result = pcall(load("return " .. serializedString))
  if success then
    return result
  else
    return nil, result
  end
end

function table.fromFile(path)
  checkArg(1, path, "string")

  if filesystem.exists(path) then
    if filesystem.isDirectory(path) then
      error("\"" .. path .. "\" is a directory")
    else
      local file = io.open(path, "r")
      local data = table.unserialize(file:read("*a"))
      file:close()

      return data
    end
  else
    error("\"" .. path .. "\" doesn't exists")
  end
end

---------------------------------------------------------------------

local myTable = table.fromFile("/myFileWithTable.lua")

 

Десериализация таблицы на чистом луа без лишних библиотек

Поделиться сообщением


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

local tab = {}

 

tab = loadfile(имя файла)()

 

В файле

 

return {...}

такое сохранение для дальнейшего чтения прокатит?

function save(tab,name)
io.open(name[w+])
file:write('return{'tab'}')
io.close()
end
 
поправьте что не так
[пока не понял как пользоваться способами сохранения написанными выше, поэтому попробовал написать своё]

Поделиться сообщением


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

 

такое сохранение для дальнейшего чтения прокатит?

function save(tab,name)
io.open(name[w+])
file:write('return{'tab'}')
io.close()
end
 
поправьте что не так
[пока не понял как пользоваться способами сохранения написанными выше, поэтому попробовал написать своё]

 

Что значит w+?

Поделиться сообщением


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

Что значит w+?

вроде как полная перезапись файла

http://antirek.github.io/luabook/standardLibraries.htm

Изменено пользователем stripwire

Поделиться сообщением


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

io.open(name[w+])

надо бы так:

io.open(name,"w")

file:write('return{'tab'}')

тут надо преобразовывать таблицу в строку. Как это сделать, писали выше. У тебя же непонятно что.

 

 

 

io.close()

наверное file:close() 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
function table.fromFile(path)checkArg(1, path, "string")   if filesystem.exists(path) then if filesystem.isDirectory(path) then error("\"" .. path .. "\" is a directory") else local file = io.open(path, "r") local data = table.unserialize(file:read("*a")) file:close()   return data end else error("\"" .. path .. "\" doesn't exists") end end

 

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

вот например, что не понимаю:

1. куда писать имя таблицы, которую сохраняем?

2.

checkArg(1, path, "string")

if filesystem.exists(path) then

if filesystem.isDirectory(path) then

error("\"" .. path .. "\" is a directory")

 

что делает каждая из этих строк?

3.

local data = table.unserialize(file:read("*a"))

что это и зачем вызывать функцию загрузки?

 

кароче, почти ничего из того кода не понял[

Изменено пользователем stripwire

Поделиться сообщением


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

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

вот например, что не понимаю:

1. куда писать имя таблицы, которую сохраняем?

2.

 

что делает каждая из этих строк?

3.

 

что это и зачем вызывать функцию загрузки?

 

кароче, почти ничего из того кода не понял[

1. Имя таблицы надо писать в функцию serialization.serialize(). Но в начале программы надо поставить serialization=require("serialization")

2. Первая строка проверяет, является ли первый аргумент функции table.fromPath строкой. Вторая проверяет, есть ли файл. Дальше идет проверка, является ли файл папкой. Если да, выводит ошибку.

3. Это чтение данных из файла и передача его в функцию десериализации (превращение строковых данных в таблицу). file - это хендлер файла, а :read - это читальщик файла - он читает данные из файла и возращает их. Можно дать ему числовой аргумент - и он прочитает столько, сколько указано прочитать. Если дать ему math.huge или "*a", он прочитает весь файл

Поделиться сообщением


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

 

 

table = serialization.unserialize (str_data)
 

тут я так понимаю на table имя таблицы в которую грузить значения, а на str_data путь к файлу с сохранённой таблицей? 

Поделиться сообщением


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

 

тут я так понимаю на table имя таблицы в которую грузить значения, а на str_data путь к файлу с сохранённой таблицей? 

 

str_data это строка, считанная из файла и содержащая таблицу в строковом виде.

Поделиться сообщением


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

str_data это строка, считанная из файла и содержащая таблицу в строковом виде.

то есть str_data менять не надо, а путь при сохранении/загрузке он сам находит?

 

 

 

serialization = require('serialization')

tbl = {}

str_data = serialization.serialize(tbl) -- сохранение

tbl = serialization.unserialize (str_data) -- загрузка

 

так? [прост странно, что путь не надо писать ._., и куда тогда он будет сейвить?]

Изменено пользователем stripwire

Поделиться сообщением


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

Огромное спасибо за подробное объяснение. Теперь даже больше понял, чем просто как сохранять и загружать таблицы].

Поделиться сообщением


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

Присоединяйтесь к обсуждению

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

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


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