Пример работы с файлами в QLua (Lua)

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 9, среднее: 4,56 из 5)
Загрузка...

Qlua-основы

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
-- Флаг поддержания работы скрипта
IsRun = true;
 
function main()
   -- Пытается открыть файл в режиме "чтения/записи"
   f = io.open(getScriptPath().."\\Test.txt","r+");
   -- Если файл не существует
   if f == nil then 
      -- Создает файл в режиме "записи"
      f = io.open(getScriptPath().."\\Test.txt","w"); 
      -- Закрывает файл
      f:close();
      -- Открывает уже существующий файл в режиме "чтения/записи"
      f = io.open(getScriptPath().."\\Test.txt","r+");
   end;
   -- Записывает в файл 2 строки
   f:write("Line1\nLine2"); -- "\n" признак конца строки
   -- Сохраняет изменения в файле
   f:flush();
   -- Встает в начало файла 
      -- 1-ым параметром задается относительно чего будет смещение: "set" - начало, "cur" - текущая позиция, "end" - конец файла
      -- 2-ым параметром задается смещение
   f:seek("set",0);
   -- Перебирает строки файла, выводит их содержимое в сообщениях
   for line in f:lines() do message(tostring(line));end
   -- Закрывает файл
   f:close();
   -- Цикл будет выполнятся, пока IsRun == true
   while IsRun do
      sleep(100);
   end;   
end;
 
function OnStop()
   IsRun = false;
end;

Если у Вас появились какие-то вопросы, задайте их в комментариях под статьей !!!

Добавить комментарий

Пример работы с файлами в QLua (Lua): 131 комментарий

  1. Здравствуйте. Такой код:

    1
    2
    3
    4
    5
    6
    
    function main()
    o=io.open(getScriptPath().."\\cur_part.txt",w);
    o:write('5');
    o:flush();
    o:close();
    end;

    но почему-то в файле так ничего и не записывается... в чем причина?

      1. Здравствуйте! Для удаления файла используйте командную строку, пример ее использования:

        1
        2
        
        -- Создает каталог
        os.execute('mkdir '..Path)

        о том какие команды поддерживает командная строка и какой у них синтаксис можете найти в интернете, я просто не помню, т.к. редко появляется необходимость. Чтобы удалить часть текста из файла, нужно перезаписать файл новым текстом без этой части.
        Здесь можете ознакомиться с функциями, которые предоставляет Lua для работы с файлами: http://www.lua.ru/doc/5.7.html

          1. Погуглите что такое командная строка Windows и какие есть команды, я не помню конкретно как файл удалить, мне так же гуглить придется. Если Вы решили заняться программированием, то не ленитесь получать новые знания и осваивать новые технологии, все пригодится когда-то.

  2. Здравствуйте.
    создаю файл с расширением ".csv", задача такая, при запуске скрипта он должен запись делать в конце файла с новой строки, по мере работы скрипта эта строка должна перезаписываться. скрипт останавливаем всё сохраняем. при следующем запуске всё так же, запись делается в конце файла с новой строки, по мере работы скрипта эта строка должна перезаписываться.
    t_file:seek("end",0)
    t_file:write("\n"..os.date()..";".."0"..";".."0")
    t_file:flush()
    , далее в скрипте нужно эту строку заменить на новую, вот не пойму как это сделать?
    и ещё,
    f:seek("set",0) из вашего примера, вот смешение на 0, что вообще значит смещение, и в чём оно измеряется? если поставить 10 то что и на сколько должно сместится?

    1. Здравствуйте, это смещение по символам, как курсор в текстовом редакторе ("set", 0) значит в самое начало (сместиться на 0 символов относительно начала), ("end", 0) значит в самый конец (сместиться на 0 символов относительно конца). Для Вашей задачи нужно просто запоминать позицию начала последней строки:

      1
      
      last_line_pos = t_file:seek("end", 0)

      а потом перезаписывать эту строку вставая в запомненную позицию

      1
      
      t_file:seek("set", last_line_pos )

      Только имейте в виду, что если Вы затираете более длинную строку более короткой, то в файле остануться символы от предыдущей строки.

  3. У меня маленький отрывок из программы:
    require "QL" -- подключаем библиотеку
    require "iuplua" -- подключаем библиотеку

    --задаем глобальные переменные

    is_run=false --переменна для запуска-остановки функции main
    time_period=1 --задаём частоту обращений к таблице параметров

    Пожалуйста подскажите мне где взять библиотеку, модуль "QL" ???? другую библиотеку(require "iuplua") я нашёл уже.

  4. Здравствуйте. что б можно было открыть файл для просмотра когда скрипт ещё работает и записывает туда данные, нужно в скрипте именно открыть уже существующий файл в режиме "чтения/записи", и после каждой записи данных в файл сохранять - f:flush(), и тогда я смогу открыть и просмотреть файл без остановки скрипта? или можно создать файл в режиме "записи", так же сохранять f:flush() и тоже можно будет просматривать?

          1. f:flush() записывает данные из буфера в файл, т.е. когда Вы пишите что-то в файл, данные пишутся не сразу в файл, а в буфер, когда буфер заполняется данные автоматически сохраняются из него в файл и буфер освобождается для новых данных, если Вам нужно, чтобы данные сразу писались в файл, то после команды записи f:write('тут что-то') вызывайте f:flush(), чтобы принудительно отправить данные из буфера в файл, не дожидаясь когда буфер наполнится.

  5. Добрый день, подскажите пожалуйста, как добраться до директории находящейся перед той, где лежит скрипт?
    Т.е. на одну выше, чем выдает getScriptPath().

  6. Добрый день . Решил написать скрипт на луа))) . Рыбу взял из простого примера с использованием файлов iuplua и QL.lua. если первый файл я прикрутил, то ql ни как не получается. Может кто подскажет, я вижу тут многие его знают))

      1. Так и сделал, C:\Program Files (x86)\Info\MYLUA\new 1.lua:7: module 'QL' not found:
        no field package.preload['QL']
        no file 'c:\lua\5.1\lua\QL.lua'
        no file 'c:\lua\5.1\clibs\QL51.dll'
        no file 'c:\lua\5.1\clibs\QL.dll'.
        приэтом файла QL.dll нет в природе.
        может привязка мешает- пример из скрипта
        package.cpath=";;c:\\lua\\5.1\\clibs\\?51.dll;c:\\lua\\5.1\\clibs\\?.dll;"
        package.path=";;c:\\lua\\5.1\\lua\\?.lua;"

          1. C:\Program Files (x86)\Info\MYLUA\new 1.lua:9: module 'QL' not found:
            no field package.preload['QL']
            no file 'c:\lua\5.1\lua\QL.lua'
            no file 'C:\Program Files (x86)\Info\QL.dll'
            no file 'c:\lua\5.1\clibs\QL51.dll'
            no file 'c:\lua\5.1\clibs\QL.dll'

            меня смущает поиск файла QL.dll. а ведь там QL.luac и QL.lua

          1. C:\Program Files (x86)\Info\MYLUA\new 1.lua:9: module 'QL' not found:
            no field package.preload['QL']
            no file 'c:\lua\5.1\lua\QL.lua'
            no file 'C:\Program Files (x86)\Info\QL.dll'
            no file 'c:\lua\5.1\clibs\QL51.dll'
            no file 'c:\lua\5.1\clibs\QL.dl
            меня смущает поиск файла QL.dll. а ведь там QL.luac и QL.lua, господи, как тяжело начинать))) косяк на уровне таблицы умножения....

            1. ошибок стало больше-
              C:\Program Files (x86)\Info\QL.lua:6: module 'socket' not found:
              no field package.preload['socket']
              no file 'C:\Program Files (x86)\Info\socket.lua'
              no file 'c:\lua\5.1\lua\socket.lua'
              no file '.\socket.lua'
              no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.lua'
              no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\init.lua'
              no file 'C:\Program Files (x86)\Lua\5.1\socket.lua'
              no file 'C:\Program Files (x86)\Lua\5.1\socket\init.lua'
              no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.luac'
              no file 'C:\Program Files\Lua\5.1\lua\socket.lua'
              no file 'C:\Program Files\Lua\5.1\lua\socket\init.lua'
              no file 'C:\Program Files\Lua\5.1\socket.lua'
              no file 'C:\Program Files\Lua\5.1\socket\init.lua'
              no file 'C:\Program Files\Lua\5.1\lua\socket.luac'
              no file '.\socket.dll'
              no file '.\socket51.dll'
              no file 'C:\Program Files (x86)\Lua\5.1\socket.dll'
              no file 'C:\Program Files (x86)\Lua

                1. то же самое C:\Program Files (x86)\Info\QL.lua:6: module 'socket' not found:
                  no field package.preload['socket']
                  no file 'C:\Program Files (x86)\Info\socket.lua'
                  no file 'c:\lua\5.1\lua\socket.lua'
                  no file '.\socket.lua'
                  no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.lua'
                  no file 'C:\Program Files (x86)\Lua\5.1\lua\socket\init.lua'
                  no file 'C:\Program Files (x86)\Lua\5.1\socket.lua'
                  no file 'C:\Program Files (x86)\Lua\5.1\socket\init.lua'
                  no file 'C:\Program Files (x86)\Lua\5.1\lua\socket.luac'
                  no file 'C:\Program Files\Lua\5.1\lua\socket.lua'
                  no file 'C:\Program Files\Lua\5.1\lua\socket\init.lua'
                  no file 'C:\Program Files\Lua\5.1\socket.lua'
                  no file 'C:\Program Files\Lua\5.1\socket\init.lua'
                  no file 'C:\Program Files\Lua\5.1\lua\socket.luac'
                  no file '.\socket.dll'
                  no file '.\socket51.dll'
                  no file 'C:\Program Files (x86)\Lua\5.1\socket.dll'
                  no file 'C:\Program Files (x86)\Lua

                  1. Видите, проблема в том, что у Вас расположение c:\Program Files (x86)\Lua5.1\, а скрипт ищет в C:\Program Files (x86)\Lua\5.1\ попробуйте это исправить у себя расположение, если и это не поможет, то лучше обратитесь к разработчикам QL, думаю, они не откажут в помощи.

                    1. спс. постараюсь найти решение, а вот разработчики ql вроде как пропали.... но я думаю решу )))

  7. 1
    
    чтобы изменения сразу же были видны в файле, нужно после строки l_file:write(tostring(Znach).."\n") добавить строку l_file:flush()

    Спасибо, теперь данные построчно складываются в файле, но все таки чтобы посмотреть изменение в файле, его нужно закрыть и потом опять открыть, так сказать "онлайн" не отображаются добавленные строки.

    1. Это уже зависит от программы, которой Вы просматриваете файл. Хотя, даже не знаю какие программы отображают изменения файла в реальном времени. Можете в Notepad++ попробовать открыть, только, если Вам нужно смотреть в реальном времени изменения, проще выводить их в таблицу.

  8. Добрый день!
    Спасибо за такой полезный ресурс. Есть вопросик.
    Допустим есть csv файл, вида:
    SBER; Сбербанк; 10
    SBERP; Сбербанк-п; 20
    ROSN; Роснефть; 120
    и т.д.
    Как заменить какое-либо значение в нем не нарушая структуры? Например, нужно у SBERP поменять 20 на 130.
    Считывать информацию из файла я научился, благодаря вашим постам, а вот с изменением затык прям какой-то.
    Заранее благодарен.

    1. Здравствуйте, пожалуйста.
      Вам придется перезаписывать файл, по крайней мере, начиная со строки изменения. Потому что в файле нет, как таковых, отдельных строк, а содержание файла примерно следующее:
      "SBER; Сбербанк; 10\nSBERP; Сбербанк-п; 20\nROSN; Роснефть; 120\n"
      По этому, если даже Вы напишите функцию, которая будет ставить указатель при помощи file.seek() в нужную позицию для перезаписи значения, то по Вашему примеру файл станет такой:
      "SBER; Сбербанк; 10\nSBERP; Сбербанк-п; 130nROSN; Роснефть; 120\n"
      И при следующем чтении строк f:lines() "Сбербанк-п; 130nROSN; Роснефть; 120" будет прочитана как одна строка, потому что символ переноса строки "\n" будет затерт.

    2. Можно, конечно, решить эту проблему, например, добавив пустой столбец в конце, заполненный пробелами, и корректировать его размер тоже, меняя какое-то значение в данной строке, создав для этого функцию записи значения в определенный столбец определенной строки. Тогда не нужно будет перезаписывать весь файл каждый раз.