Перейти к содержимому
Alex1993

[CC] Библиотека для работы с конфиг файлами

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

Функции

cfg.write(file,key,value) Функция write записывает в файл значение key и value (test_key=9932).

cfg.read(file, key) Функция read возвращает значение ключа указанного значением key.

Pastebin: http://pastebin.com/ikAAAgBb

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


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

Чего-то я не понял юмора. Оно что, в один файл записывает только одно значение? :o  Зачем там цикл тогда, если там только одна строка и одно волъю. В чем замысел и хитрость глубины глубин? У тебя по сути ключ, это имя самого файла,  а не ключа в файле в таком случае.

 

Глянь, как это реализовано для ОС. Конфиг для того и конфиг, что хранить он должен множество значений ключ='значение', а не одно.

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


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

local file=fs.open(sfile..".ltx","a") добавляет новую строку, но не заменяет существующие

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


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

local file=fs.open(sfile..".ltx","a") добавляет новую строку, но не заменяет существующие

да до врайта я и не дошел и не видел там адд. окей, Но что делает read?

 

  1. function read(sFile,key)
  2.         if not fs.exists(sFile..".ltx") then error("No such file") end
  3.         local file = fs.open(sFile..".ltx","r")
  4.         while true do
  5.                 local line = file.readLine()
  6.                 if line ~= nil then
  7.                         local key, value = string.match(line,"(.*)=(.*)")
  8.                         if value ~= nil and key == key then
  9.                                 file.close()
  10.                                 return value
  11.                         end
  12.                 else
  13.                         file.close()
  14.                         break
  15.                 end
  16.         end
  17. end
 
она же по идее прочитает первую строчку и завершится, отретурнив первое значение. Скорее всего там ошибка в "a" и мыслилось "r" как раз то и хранить  по одной строке в файле. В любом случае там и намека нет на возврат массива данных ключ-значение , а тем более на их изменение, и явно идет завершение функции при считывании первого лайна и закрытие файла. Без автора мы никогда не узнаем правды и задумки. А бесконечное дописывание конфига вообще не имеет смысла, тем более, если его даже нельзя весь прочитать библой.

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


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

Там стоят строки

local key, value = string.match(line,"(.*)=(.*)")
if value ~= nil and key == key then

Т.е. считанная строка разбивается на key и value, а затем идет проверка на то что value содержит какое-нибудь значение, и key совпадает с нужным.

В противном случае идет чтение строк из файла дальше.

 

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

 

А также паттерн "(.*)=(.*)" не подразумевает возможности пробелов перед или после равно. Если конфиг пишет программа - это не важно, но в случаее ручной правки конфига может вызвать ошибки.

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

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


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

 

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

 

 

то есть как минимум поиск по ключу нужно написать вроде

function read(sFile,key)
   if not fs.exists(sFile..".ltx") then return false, "No such file" end
        local file = fs.open(sFile..".ltx","r")
        for line in file:lines()
          local key_f, value = string.match(line,"(.*)=(.*)")
          if key == key_f then
             file.close()
             return value
          end
        end
   file.close()
   return false, 'No such key'
end

ну и патерн как-то универсальным сделать, чтобы можно было прочитать  name='Big Bob', тогда хоть какой-то смысл в библе есть.

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


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

то есть как минимум поиск по ключу нужно написать вроде

...

ну и патерн как-то универсальным сделать, чтобы можно было прочитать  name='Big Bob', тогда хоть какой-то смысл в библе есть.

 

Ага. Паттерн можно сделать такой: "(%S+)%s*=%s*(.*)".

Таким образом будут корректно парситься строки вроде

name=Вася Пупкин
age = 99
  tab_len=  2
are_you_crazy =true

Если после равно не будет текста, value примет значение "".

Если добавить экранирование строк-комментариев (например знаком #), будет вообще отлично.

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


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

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

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

Гость
Ответить в тему...

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

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

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

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

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


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