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

Автор записи: Дмитрий (Admin)
1 звезда2 звезды3 звезды4 звезды5 звезд (Голосов 8, среднее: 4,50 из 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. http://www.user.su/lua/

      os.remove (filename)

      Удалаяет файл или директорию с заданным именем. Директории должны быть пусты. Если функция
      не может провести удаления, она возвращает nil, плюс строку, содержащую описание ошибки.

    2. os.remove (filename)

      Удалаяет файл или директорию с заданным именем. Директории должны быть пусты. Если функция
      не может провести удаления, она возвращает nil, плюс строку, содержащую описание ошибки.

  1. Здравствуйте. Скажите, есть ли функция, чтобы удостоверится, что файл уже открыт другим процессом ( ботом)? Т.е. хочу в один файл писать из разных роботов и чтобы не было конфликта, что бы робот "ждал" пока другой закончил чтение/запись и закрыл файл. Вроде, это что-то простое должно быть?

    1. Файл открывается у меня для чтения local f = io.open(path, "r+")
      Файл открывается у меня для записи local f = io.output(path)
      Правда я не проверял, может уже будет "конфликт" и можно его "зафиксировать" и ждать...

      1. только обрабатывая ошибки открытия файла. примерно так:

        1
        2
        3
        4
        5
        6
        
        local f, err = io.open("filename.txt", "w")
        if f then
            -- do something with f
        else
            print("Error opening file: " .. err)
        end

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

        а в чем задача состоит? вы через файлы хотите сделать взаимодействие между роботами? если да, то вот есть решение лучше: quikluacsharp.ru/stati-uchastnikov/biblioteka-lua_share-obmen-dannymi-mezhdu-skriptami-i-prilozheniyami/

        1. Задача: хотел просто в общий тхт файл кой какую статистику писать. Каждый робот пишет свое, но в один файл. Что бы его открыл и видишь в целом, что в Квике с торговлей происходит. У какого бота какая позиция, соответствует ли она общей позиции в квике и т.д.

          1. посмотрите либу по ссылке, это как раз ваш случай. вы можете написать некий код, который будете вызывать из разных скриптов или даже разных квиков, и при этом у вас не будет проблем с доступом из разных скриптов/приложений.

    1. "и почему в конце , "r+", что оно делает? И для чего нужна" - это режим открытия файла r от слова read - чтение, знак + означает что можно еще и писать будет в файл, в итоге "r+" означает режим чтения/записи

      "Не могли бы Вы объеснить чуть краче , тоесть , что такое getScriptPath()..""\\" - getScriptPath() это функция встроенная в QLua, которая возвращает полный путь к скрипту, из которого она вызвана, оператор ".." называется оператором конкатенации, т.е. служит для склеивания нескольких строк в одну. В итоге, если Ваш скрипт находится в папке "C:\\Trading", то в результате склейки получится строка "C:\\Trading\\Test.txt", двойной слеш используется для экранирования символа слеш, т.к. есть различные спецсимволы, которые содержат в себе слеш, например, "\n" означает перенос строки, и чтобы в строку добавить именно символ слеш, который компьютер не будет пытаться распознать как начало спецсимвола, нужно экранировать его вторым слешем.

  2. Такой вопрос. Если я "поставил" курсор в нужное место, то я могу как-то "вставлять" или наоборот "затирать"?
    Например, есть строка в файле : "Я иду в школу", "ставлю" курсор перед "школу" . Если я в это место впишу "любимую" , то получится: "Я иду в любимую" правильно? Т.е. школа затрется? А можно "вставить" чтобы получилось "... в любимую школу". Или запись в файл как раз наоборот работает - вставляет , а не затирает? Или может даже есть разные способы? Понятно что можно считать весь файл и работать уже с текстом и потом полностью перезаписать. А вот сразу в файл так нельзя писать в разных режимах?

    1. Только перезаписывать поверх можно, вставлять нельзя, файл это область памяти выделенная, к ней можно только добавить в конец еще какой-то объем памяти. Это как строка в тетради написанная, Вы же не сможете внутрь нее еще слов вставить, только перезаписать поверх, или в конец добавить. С файлами так же.

  3. День добрый.
    как получить значение из последней строки в txt файле?
    как получить значение из последний строки предпоследнего столбца в файле csv, или например 3 столбца?

    1. Добрый день, готовых функций для этого нет, вариант только изобретать свои, используя функции работы со строками, потому что текстовый файл, это, по сути, один массив символов, в котором строки отделяются символами переноса строки "\n", в CSV файле то же самое, строки разделены символами "\n", а ячейки символами ";" чаще всего. Если Вам нужно работать с разными элементами файла, то попробуйте лучше вот эту технологию применить: https://quikluacsharp.ru/quik-qlua/sohranenie-parametrov-skripta-qlua-lua-mezhdu-zapuskami/
      Там все сводится к удобной работе с таблицей lua, ее считыванием из файла, изменением и повторным сохранением в файл.

  4. Добрый день!
    Данный скрипт

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    IsRun = true;
    function main()
    f=io.open(getScriptPath("C:\\ROBOT\\TIC.txt"),"r+");
    if f == nil then 
    f=io.open(getScriptPath("C:\\ROBOT\\TIC.txt"),"w");
    f:close();
    f=io.open(getScriptPath("C:\\ROBOT\\TIC.txt"),"r+");
    f:write("5");
    f:flush();
    f:close();
    end;
    while IsRun do
          sleep(100);
       end;   
    end;
    function OnStop()
       IsRun = false;
    end;

    Ошибка lua:6: attempt to index global 'f' (a nil value)
    Помогите разобраться!