как удалять строки из ini-file

leekyrave

Известный
Автор темы
418
226
Версия MoonLoader
.027.0-preview
Трефа не удаляй,мне в темке не помогают.


Как удалить строку из ини файла?
ini.tablica[k] = nil - работает,но нужно удалять по очереди,а не любой элемент массива
 
Решение
ну покажи через ио
WARNING! GOVNOCODE!

Lua:
script_name("test lua")
script_author("Котовский")
script_description("Lua file for test new scripts")
script_version("1.0")

-- Библиотеки
local res           = pcall(require, "lib.moonloader")                      assert(res, "Lib MOONLOADER not found!")
local res           = pcall(require, 'lib.sampfuncs')                       assert(res, 'Lib SAMPFUNCS not found')
-- переменные
local f_path = getGameDirectory().."\\moonloader\\test\\list"           -- Путь до нужного файла 
if not doesFileExist(f_path) then                               -- Проверка на файлик, первый запуск
    createDirectory(getGameDirectory().."\\moonloader\\test")   -- Создаем папку
    f = io.open(f_path, "w")...

leekyrave

Известный
Автор темы
418
226
Чего?! Так укажи какой нужно удалять.
у меня через цикл выводит текст и кнопки. по нажатию на кнопку текст удаляется из ини файла.
текст = кнопка
текст = кнопка
текст = кнопка
 

leekyrave

Известный
Автор темы
418
226
У тебя в иник как добавляется, так и удаляется, правильно?
То есть нет обычной таблицы, она может как пополняться, так и удаляться, верно понял?
есть формат таблицы чекера
например

1 = Вальтер_Скотт
2 = Чарльз_Бруно
3 = Виктор_Сампаро
4 = Джон Дин
5 = Леонардо_Джейден
6 = Лео_Рокс

То бишь ключ присваивается к ним автоматически.

Я пытаюсь удалять значения с помощью

Lua:
if imgui.Button(u8"Удалить") then ini.checker[k] = nil inicfg.save(def,directIni)end


Удалять получается только по очередности,то бишь с 1 по 6,а не какой угодно ник. Код выше - ясное дело находится в цикле
 

meowprd

Тот самый Котовский
Проверенный
1,298
731
есть формат таблицы чекера
например

1 = Вальтер_Скотт
2 = Чарльз_Бруно
3 = Виктор_Сампаро
4 = Джон Дин
5 = Леонардо_Джейден
6 = Лео_Рокс

То бишь ключ присваивается к ним автоматически.

Я пытаюсь удалять значения с помощью

Lua:
if imgui.Button(u8"Удалить") then ini.checker[k] = nil inicfg.save(def,directIni)end


Удалять получается только по очередности,то бишь с 1 по 6,а не какой угодно ник. Код выше - ясное дело находится в цикле
А тебе обязательно нужно использовать ключи и иники?
Могу предложить тебе идею на обычных txt через io
 

meowprd

Тот самый Котовский
Проверенный
1,298
731
ну покажи через ио
WARNING! GOVNOCODE!

Lua:
script_name("test lua")
script_author("Котовский")
script_description("Lua file for test new scripts")
script_version("1.0")

-- Библиотеки
local res           = pcall(require, "lib.moonloader")                      assert(res, "Lib MOONLOADER not found!")
local res           = pcall(require, 'lib.sampfuncs')                       assert(res, 'Lib SAMPFUNCS not found')
-- переменные
local f_path = getGameDirectory().."\\moonloader\\test\\list"           -- Путь до нужного файла 
if not doesFileExist(f_path) then                               -- Проверка на файлик, первый запуск
    createDirectory(getGameDirectory().."\\moonloader\\test")   -- Создаем папку
    f = io.open(f_path, "w")                                    -- Создаем файл через открытие его в режиме записи
    f:write("Meow_Brightside")                                  -- Делаем первую строку, чтобы потом не было пустых строк, лень было делать доп проверки в addonfile
    f:close()                                                   -- Закрываем, сохраняем
    print("Был создан файл list.")                              -- Пишем в консоль что создали
end
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("test.lua loaded", -1)
    while true do 
        wait(0)
    end
end
function addonfile(params) -- params может принять ID игрока, либо сразу Nick
    if type(tonumber(params)) == 'number' then -- Если принимаем ID игрока
        params = tonumber(params)   -- Меняем тип
        if not sampIsPlayerConnected(params) then return end -- чекаем подключен ли игрок
        name = sampGetPlayerNickname(params)    -- получаем ник игрока
    else name = tostring(params) end    -- Если принимаем сразу ник игрока, то просто переведем в string на всякий случай
    f = io.open(f_path, "a+") -- открываем наш файл в режиме добавления
    for line in f:lines() do -- проходимся по каждой строчке и проверяем нет ли у нас такого ника уже в списке
        if line ~= '' and line ~= nil then -- проверка на пустые строки
            if line:match(name.."$") then -- если находим ник в файле
                f:close() -- закрываем его
                return -- прекращаем
            end
        end
    end
    f:write(("\n%s"):format(name)) -- иначе записываем в файл на новой строке
    f:close() -- закрываем, сохраняем
end
function delonfile(params) -- params может принять ID игрока, либо сразу Nick 
    if type(tonumber(params)) == 'number' then -- Если принимаем ID игрока
        params = tonumber(params) -- Меняем тип
        if not sampIsPlayerConnected(params) then return end -- чекаем подключен ли игрок
        name = sampGetPlayerNickname(params) -- получаем ник игрока
    else name = tostring(params) end -- Если принимаем сразу ник игрока, то просто переведем в string на всякий случай
    f = io.open(f_path, "r") -- открываем файл в режиме чтения
    local tempign = "" -- переменная, которая будет содержать в себе временную инфу из нашего файла
    found = false -- булевая переменная, которая будет принимать true, если нашли нужный ник в файле
    first_line = true -- переменная, чтобы не было лишней первой пустой строки
    for line in f:lines() do -- проходимся по каждой строке
        if line ~= '' and line ~= nil then -- если строка не пустая
            if line:match(name.."$") then -- если найден нужный ник в файле
                line = string.gsub(line, name, "") -- то заменяем его на "ничего"
                found = true -- показываем что нашли нужный ник и заменили его
            end
            if first_line then tempign = line first_line = false -- тут костыли, говнокод и все дела
            else tempign = string.format("%s\n%s", tempign, line) end -- в этих двух строках мы как бы обновляем наш файл, избавляясь от нужного нам ника
        end
    end
    if found then -- если все таки нашли
        f:close() -- закрываем файл, который открывали в режиме чтения
        f = io.open(f_path, "w") -- открываем его уже в режиме записи, на этом этапе файл полностью очистит свое содержимое
        f:write(tempign) -- для этих целей мы и писали во временную переменную нужную нам инфу, теперь пишем ее в файл
        f:close() -- сохраняем
    else f:close() end -- ну, а если и не нашли, то просто закрываем файл
end
 
  • Злость
Реакции: Tema05

Tema05

Известный
1,505
470
есть формат таблицы чекера
например

1 = Вальтер_Скотт
2 = Чарльз_Бруно
3 = Виктор_Сампаро
4 = Джон Дин
5 = Леонардо_Джейден
6 = Лео_Рокс

То бишь ключ присваивается к ним автоматически.

Я пытаюсь удалять значения с помощью

Lua:
if imgui.Button(u8"Удалить") then ini.checker[k] = nil inicfg.save(def,directIni)end


Удалять получается только по очередности,то бишь с 1 по 6,а не какой угодно ник. Код выше - ясное дело находится в цикле
Насколько я знаю нельзя в ini использовать в виде ключа цифры. Или у этого есть побочные эффекты.
 

Tema05

Известный
1,505
470
WARNING! GOVNOCODE!

Lua:
script_name("test lua")
script_author("Котовский")
script_description("Lua file for test new scripts")
script_version("1.0")

-- Библиотеки
local res           = pcall(require, "lib.moonloader")                      assert(res, "Lib MOONLOADER not found!")
local res           = pcall(require, 'lib.sampfuncs')                       assert(res, 'Lib SAMPFUNCS not found')
-- переменные
local f_path = getGameDirectory().."\\moonloader\\test\\list"           -- Путь до нужного файла
if not doesFileExist(f_path) then                               -- Проверка на файлик, первый запуск
    createDirectory(getGameDirectory().."\\moonloader\\test")   -- Создаем папку
    f = io.open(f_path, "w")                                    -- Создаем файл через открытие его в режиме записи
    f:write("Meow_Brightside")                                  -- Делаем первую строку, чтобы потом не было пустых строк, лень было делать доп проверки в addonfile
    f:close()                                                   -- Закрываем, сохраняем
    print("Был создан файл list.")                              -- Пишем в консоль что создали
end
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage("test.lua loaded", -1)
    while true do
        wait(0)
    end
end
function addonfile(params) -- params может принять ID игрока, либо сразу Nick
    if type(tonumber(params)) == 'number' then -- Если принимаем ID игрока
        params = tonumber(params)   -- Меняем тип
        if not sampIsPlayerConnected(params) then return end -- чекаем подключен ли игрок
        name = sampGetPlayerNickname(params)    -- получаем ник игрока
    else name = tostring(params) end    -- Если принимаем сразу ник игрока, то просто переведем в string на всякий случай
    f = io.open(f_path, "a+") -- открываем наш файл в режиме добавления
    for line in f:lines() do -- проходимся по каждой строчке и проверяем нет ли у нас такого ника уже в списке
        if line ~= '' and line ~= nil then -- проверка на пустые строки
            if line:match(name.."$") then -- если находим ник в файле
                f:close() -- закрываем его
                return -- прекращаем
            end
        end
    end
    f:write(("\n%s"):format(name)) -- иначе записываем в файл на новой строке
    f:close() -- закрываем, сохраняем
end
function delonfile(params) -- params может принять ID игрока, либо сразу Nick
    if type(tonumber(params)) == 'number' then -- Если принимаем ID игрока
        params = tonumber(params) -- Меняем тип
        if not sampIsPlayerConnected(params) then return end -- чекаем подключен ли игрок
        name = sampGetPlayerNickname(params) -- получаем ник игрока
    else name = tostring(params) end -- Если принимаем сразу ник игрока, то просто переведем в string на всякий случай
    f = io.open(f_path, "r") -- открываем файл в режиме чтения
    local tempign = "" -- переменная, которая будет содержать в себе временную инфу из нашего файла
    found = false -- булевая переменная, которая будет принимать true, если нашли нужный ник в файле
    first_line = true -- переменная, чтобы не было лишней первой пустой строки
    for line in f:lines() do -- проходимся по каждой строке
        if line ~= '' and line ~= nil then -- если строка не пустая
            if line:match(name.."$") then -- если найден нужный ник в файле
                line = string.gsub(line, name, "") -- то заменяем его на "ничего"
                found = true -- показываем что нашли нужный ник и заменили его
            end
            if first_line then tempign = line first_line = false -- тут костыли, говнокод и все дела
            else tempign = string.format("%s\n%s", tempign, line) end -- в этих двух строках мы как бы обновляем наш файл, избавляясь от нужного нам ника
        end
    end
    if found then -- если все таки нашли
        f:close() -- закрываем файл, который открывали в режиме чтения
        f = io.open(f_path, "w") -- открываем его уже в режиме записи, на этом этапе файл полностью очистит свое содержимое
        f:write(tempign) -- для этих целей мы и писали во временную переменную нужную нам инфу, теперь пишем ее в файл
        f:close() -- сохраняем
    else f:close() end -- ну, а если и не нашли, то просто закрываем файл
end
Ну вот зачем? Он же всё равно заюзает это...
 

meowprd

Тот самый Котовский
Проверенный
1,298
731
Он и не притронется. Даже мысли не будет улучшить твой код.
Не думай чужой головой, совет на всю жизнь.
Предложи ему свой вариант, раз уж мой тебе не нравится