Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[Обучение] Базовая библиотека Lua.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
57.24 Кб
Скачать

Ввод/вывод

Пакет io поддерживает две модели ввода/вывода. В первой модели используются умалчиваемые потоки ввода и вывода, которые можно назначить на заданные файлы. Во второй модели каждому файлу соответствует дескриптор и операции ввода/вывода производятся с этим дескриптором. Также таблица io содержит открытые по умолчанию файловые дескрипторы io.stdin, io.stdout и io.stderr.

Открытие файловых дескрипторов

io.open(filename [, mode])

Открывает файл и возвращает файловый дескриптор или nil, сообщение об ошибке и номер ошибки при неудаче.

Допустимые режимы:

'r' чтение

'w' запись

'a' добавление

'r+' обновление с сохранением

'w+' обновление с очисткой

'a+' добавление и обновление с сохранением

Строка режима может содержать на конце букву 'b', что означает открытие файла в бинарном режиме.

io.popen(prog [, mode])

Запускает процесс prog и возвращает файл, связанные с потоком ввода (если mode == 'w') или потоком вывода (если mode == 'r', значение по умолчанию) запущенного процесса.

io.tmpfile()

Возвращает файловый дескриптор временного файла.

Переназначение умалчиваемых потоков

io.input([file])

Устанавливает умалчиваемый поток ввода на переданный дескриптор. Если функция вызвана без аргументов, то она возвращает умалчиваемый дескриптор.

io.output([file])

Аналогична io.input(), но устанавливает умалчиваемый поток вывода.

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

Форматные строки

При чтении из файла используются следующие форматные строки:

'*all'

Чтение всего файла целиком с текущей позиции. При попытке чтения за концом файла и для пустого файла возвращается пустая строка.

'*line'

Чтение одной строки (символа конца строки не добавляется в строку). При попытке чтения за концом файла возвращается nil. Это  —  умалчиваемое поведение для функций чтения.

'*number'

Чтение числа. В случае неудачи возвращает nil.

ddd

Чтение не более чем заданного числа (ddd) символов. При попытке чтения за концом файла (если не удалось прочитать ни одного символа) возвращается nil. При num = 0 возвращается пустая строка или nil, если достигнут конец файла.

Операции с файлами

Описанные ниже функции присутствуют как в самом пакете io, так и в каждом дескрипторе файла, поэтому здесь они описаны безотносительно контекста вызова. Например, функция read() для умалчиваемого потока ввода вызывается как io.read(), а для файлового дескриптора как file:read().

read(fmt1, ...)

Читает данные в соответствии со строками формата. Каждой строке формата соответствует одно возвращаемое значение.

lines()

Возвращает функцию-итератор по строкам потока ввода.

write(v1, ...)

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

flush()

Сбрасывает буфер потока.

close()

Закрывает поток.

В случае умалчиваемых потоков функции flush() и close() относятся к потоку вывода.

Функции io.lines() также можно передать имя файла. В этом случае файл будет открыт в текстовом режиме, а после чтения последней строки файл будет автоматически закрыт. При этом не происходит замены умалчиваемого потока ввода.

Дополнительно файловые дескрипторы имеют функцию seek():

file:seek([base] [, offset])

Устанавливает текущую позицию в файле. Смещение offset задает позицию относительно базы, задаваемой параметром base:

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

"cur" от текущей позиции

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

При успехе возвращает абсолютную позицию в файле, а при неудаче  —  nil и сообщение об ошибке. Умалчиваемые значения base = "cur", offset = 0.

Вызов этой функции без параметров возвращает текущую позицию в файле, вызов file:seek("set") позиционирует указатель на начало файла, вызов file:seek("end") позиционирует указатель на конец файла и возвращает его размер.