Работа с файлами в Lua (Basic)
Lua имеет множество встроенных функций для обработки этого с помощью библиотеки ввода-вывода. Библиотека ввода-вывода работает как с текстовыми, так и с двоичными файлами. Lua-агностик Unicode. Это означает, что все строки эффективно обрабатываются как двоичные данные, а не как какой-либо вид кодирования. Из-за этого вам редко нужно использовать библиотеку Unicode, за исключением более конкретных случаев использования.
Открыть и закрыть
Прежде чем мы приступим к чтению или письму, нам нужно обсудить открытие и закрытие файлов. Ваш рабочий процесс обычно включает в себя открытие файла, выполнение с ним каких-либо действий, а затем явное его закрытие. Когда вы выходите из программы, файл также должен закрыться, но это считается плохой практикой.
Чтобы открыть файл:
io.open( [имя файла] [, [режим]] )
Имя файла находится там, где находится файл, а режим указан в таблице ниже (или после того же режима, что и в C для fopen). Если нет режима, подразумевается r.
r | (По умолчанию) Откроется файл только для чтения.
|
w | Откроется файл для записи. Перезаписывает содержимое или создает новый файл.
|
a | Добавить файл. Напишите до конца или создайте новый файл. Операции репозиции игнорируются.
|
r+ | Откроется файл в режиме чтения и записи. Файл должен существовать.
|
w+ | + Откроется файл для записи. Очищает существующее содержимое или создает новый файл. |
a+ | Добавится файл в режим чтения. Напишите до конца или создайте новый файл. Операции перемещения влияют на режим чтения.
|
Вы также можете использовать модификатор b в конце режима, чтобы открыть файл в двоичном режиме. Например:
io.open( [файл], «r+b» )
io.open возвращает объект дескриптора файла. При работе с открывающимися файлами вы должны назначить дескриптор файла переменной, чтобы сделать что-нибудь полезное.
localfilehandle = io.open( «mycontents.txt», «рб» )
Как только вы закончите с файлом, вам нужно его закрыть.
localfilehandle = io.open( «mycontents.txt», «рб» )
…
filehandle:close()
Чтение файлов
Как только вы откроете свой файл, вы сможете его прочитать. Чтение осуществляется через:
filehandle:read( «[option]» [or: [number]] )
Параметры соответствуют следующей таблице для Lua 5.1 и 5.2:
*line | *l | Считывает одну строку из файла.
|
*all | *a | Считывает все содержимое из файла. |
*number | *n | Считывает номер из файла. Это читается до конца допустимой последовательности.
|
[number] | (integer) | Считывает [количество] символов (байт) из файла. Не использует кавычки.
|
Lua 5.3 добавляет следующее (но имеет обратную совместимость):
a | Считывает все содержимое из файла.
|
l | Считывает одну строку из файла. |
L | Считывает одну строку из файла, но сохраняет символ конца строки(ы)
|
n | Считывает номер из файла. Это читается до конца допустимой последовательности.
|
[number] | Считывает [number] символы (байты) из файла. Не использует кавычки.
|
В основном все они возвращают ноль, если нет допустимой последовательности, за исключением параметров “все”, которые возвращают пустую строку до тех пор, пока файл действителен. Давайте посмотрим все это в действии с помощью test.txt:
123
line 2
123456789(Обратите внимание на новую строку в конце test.txt)
Давайте попробуем каждый из наших вариантов для чтения и посмотрим, что мы получим. Мы собираемся начать весь файл снова и снова, чтобы избежать каких-либо проблем.
#!/usr/bin/lua5.1
local file = io.open( «test.txt», «р» )
localcontens= файл:read( «*all» )
print(contens )file:close()
На выходе у нас получается:
./file1.lua
123
строка 2
123456789
Давайте разберем все наши варианты вместе теперь, когда мы увидели основную структуру:
#!/usr/bin/lua5.1
print( «*all» )
local file= io.open( «test.txt», «р» )
localcontens= file:read( «*all» )
print(contens )
file:close()print()
print( «*строка» )
local file = io.open( «test.txt», «р» )
local contents = file:read( «*line» )
print( contents )
file:close()print ()
print( «*number» )
local file= io.open( «test.txt», «р» )
local contents = file:read( «*number» )
print(contents )
file:close()print()
print( «6» )
local file= io.open( «test.txt», «р» )
local contents = file:read( 6 )
print(contents )
file:close()
На выходе у нас получается:
./file1.lua
*all
123
строка 2
123456789*line
123*number
1236
123
li
Давайте сделаем то же самое с Lua 5.3:
#!/usr/bin/lua5.3
print( «a» )
local file= io.open( «test.txt», «р» )
local contents = file:read( «a» )
print( contents )
file:close()print ()
print( «l» )
local file= io.open( «test.txt», «р» )
local contents= файл:read( «l» )
print(contents )
file:close()print ()
print( «L» )
local file= io.open( «test.txt», «р» )
local contents= файл:read( «L» )
print (contents )
file:close()print()
print( «n» )
local file= io.open( «test.txt», «р» )
local contents = file:read( «n» )
print (contents )
file:close()print()
print( «6» )
local file= io.open( «test.txt», «р» )
local contents= file:read( 6 )
print (contents )
file:close()
И мы получаем:
./file1.lua
a
123
строка 2
123456789l 123
L 123
n 123
6
123
li