English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Файл I/O Lua

Библиотека ввода-вывода Lua используется для чтения и обработки файлов. Она разделена на простой режим (как и C) и полный режим.

  • Простой режим (простой модель) имеет один текущий входной файл и один текущий выходной файл, и предоставляет операции, связанные с этими файлами.

  • Полный режим (полный модель) использует внешние файловые дескрипторы для реализации. Он представляет все файловые операции в виде методов файлового дескриптора в виде объектно-ориентированного подхода

Простой режим подходит для выполнения некоторых простых операций с файлами. Однако для выполнения некоторых более сложных операций с файлами простой режим显得 недостаточно. Например, для одновременного чтения нескольких файлов лучше использовать полный режим.

Операция открытия файла:

file = io.open (filename[, mode])

Значения mode:

РежимОписание
rОткрывает файл для чтения, файл должен существовать.
wОткрывает файл для записи, если файл существует, длина файла устанавливается в ноль, то есть содержимое файла исчезнет. Если файл не существует, он будет создан.
aОткрывает файл для записи с добавлением, если файл не существует, он будет создан, если файл существует, данные будут добавлены в конец файла, то есть сохранится прежнее содержимое файла (сохраняется EOF-символ).
r+Открывает файл для чтения и записи, файл должен существовать.
w+Открывает файл для чтения и записи, если файл существует, длина файла устанавливается в ноль, то есть содержимое файла исчезнет. Если файл не существует, он будет создан.
a+Как и a, но этот файл можно читать и записывать
bБинарный режим, если файл является бинарным файлом, можно добавить b
+Знак '+' означает, что файл может быть как читаем, так и записываем

Простой режим

Простой режим использует стандартные I/O или один текущий входной файл и один текущий выходной файл.

Ниже приведен код файла file.lua, оперирующий файлом test.lua (если его еще нет, его необходимо создать), код следующий:

-- Открыть файл в режиме только чтения
file = io.open("test.lua", "r")
-- Установить файл по умолчанию для ввода как test.lua
io.input(file)
-- Вывести первую строку файла
print(io.read())
-- Закрыть открытый файл
io.close(file)
-- Открывает файл для записи в режиме дополнения
file = io.open("test.lua", "a")
-- Установить файл по умолчанию для вывода как test.lua
io.output(file)
-- Добавить комментарий Lua в последнюю строку файла
io.write("--  test.lua комментарий в конце файла")
-- Закрыть открытый файл
io.close(file)

Выполните приведенный выше код, и вы увидите, что была выведена информация о первом строке файла test.lua, и в последней строке файла добавлен комментарий lua. Как, например, я выведу:

-- test.lua файл

В приведенных выше примерах мы использовали метод io."x", где io.read() не имеет параметров, но параметры могут быть из следующей таблицы:

РежимОписание
"*n"Читает цифру и возвращает ее. Например: file.read("*n")
"*a"Читает весь файл от текущей позиции. Например: file.read("*a")
"*l" (по умолчанию)Читает следующую строку и возвращает nil при EOF. Например: file.read("*l")
numberВозвращает строку, состоящую из указанного количества символов, или nil при EOF. Например: file.read(5)

Другие методы io:

  • io.tmpfile():Возвращает временный файловый дескриптор, который открывается в режиме обновления и автоматически удаляется при завершении программы

  • io.type(file): Проверяет, является ли obj доступным файловым дескриптором

  • io.flush(): Записать все данные из буфера в файл

  • io.lines(опциональное имя файла): Возвращает функцию итератора, которая возвращает содержимое строки из файла при каждом вызове, при достижении конца файла возвращает nil, но не закрывает файл

Полный режим

Обычно нам нужно обрабатывать несколько файлов одновременно. Мы должны использовать file:function_name вместо метода io.function_name. Ниже приведен пример того, как можно одновременно обрабатывать один и тот же файл:

-- Открыть файл в режиме только чтения
file = io.open("test.lua", "r")
-- Вывести первую строку файла
print(file:read())
-- Закрыть открытый файл
file:close()
-- Открывает файл для записи в режиме дополнения
file = io.open("test.lua", "a")
-- Добавить комментарий Lua в последнюю строку файла
file:write("--test")
-- Закрыть открытый файл
file:close()

Выполните приведенный выше код, и вы увидите, что была выведена информация о первом строке файла test.ua, и в последней строке файла добавлен комментарий lua. Как, например, я выведу:

-- test.lua файл

Параметры read совпадают с простым режимом.

Другие методы:

  • file:seek(optional whence, optional offset): Установить и получить текущую позицию файла, при успешном выполнении возвращает конечную позицию файла (в байтах), при ошибке возвращает nil и ошибку. Значение параметра whence может быть:

    Если не указан параметр file:seek(),则在озвращает текущую позицию, file:seek("set") определяет положение в начале файла, file:seek("end") определяет положение в конце файла и возвращает размер файла

    • "set": от начала файла

    • "cur": от текущей позиции [по умолчанию]

    • "end": от конца файла

    • offset: по умолчанию 0

  • file:flush(): Записать все данные из буфера в файл

  • io.lines(опциональное имя файла): Открывает指定的 файл filename в режиме чтения и возвращает функцию итератора, которая возвращает содержимое строки файла при каждом вызове, когда достигает конца файла, возвращает nil и автоматически закрывает файл.
    Если не указан параметр, io.lines() io.input():lines(); читает содержимое стандартного ввода, но не закрывает файл, например:

    for line in io.lines("main.lua") do
      print(line)
      end

В следующем примере используется метод seek, который определяет положение в файле на 25-ом месте от конца и использует параметр *a метода read, то есть читает весь файл от текущей позиции (25-ого места от конца).

-- Открыть файл в режиме только чтения
file = io.open("test.lua", "r")
file:seek("end",-25)
print(file:read("*a"))
-- Закрыть открытый файл
file:close()

Результат вывода с моей стороны:

st.lua Конец файла --test