Файловый ввод-вывод в Lua

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

  • Простая модель имеет текущий входной файл и текущий выходной файл и предоставляет операции, связанные с этими файлами.
  • Полная модель использует внешние файловые дескрипторы для реализации. В объектно-ориентированной форме она определяет все файловые операции как методы файлового дескриптора.

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

Оператор открытия файла выглядит следующим образом:

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

Значения mode:

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

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

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

Ниже приведён код файла 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() мы не передали параметр. Параметр может быть одним из следующих в таблице:

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

Другие методы io включают:

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

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

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

  • io.lines(необязательное имя файла):Возвращает функцию-итератор. При каждом вызове будет получать строку из файла. При EOF возвращает 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.lua и добавляет комментарий Lua в последнюю строку файла. Например, мой вывод здесь:

-- test.lua 文件

Параметры read такие же, как в простом режиме.

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

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

    • "set": начинать с начала файла
    • "cur": начинать с текущей позиции [по умолчанию]
    • "end": начинать с конца файла
    • offset: по умолчанию 0
    Без параметров file:seek() возвращает текущую позицию; file:seek("set") устанавливает позицию в начало файла; file:seek("end") устанавливает позицию в конец файла и возвращает размер файла.
  • file:flush():Записывает все буферизованные данные в файл.

  • io.lines(необязательное имя файла):Открывает указанный файл filename в режиме чтения и возвращает функцию-итератор. Каждый вызов получает строку из файла. При достижении EOF возвращает 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
Другие расширения