LISP - Файловый ввод-вывод
Мы обсудили, как стандартный ввод и вывод обрабатывается общим LISP. Все эти функции также работают для чтения и записи в текстовые и двоичные файлы. Единственная разница в том, что в этом случае мы используем не стандартный поток ввода или вывода, а поток, созданный для конкретной цели записи или чтения из файлов.
В этой главе мы увидим, как LISP может создавать, открывать, закрывать текстовые или двоичные файлы для хранения своих данных.
Файл представляет собой последовательность байтов, независимо от того, текстовый это файл или двоичный файл. В этой главе вы познакомитесь с важными функциями / макросами для управления файлами.
Открытие файлов
Вы можете использовать openфункция для создания нового файла или открытия существующего файла. Это самая основная функция для открытия файла. Тем не менееwith-open-file обычно более удобен и используется чаще, как мы увидим позже в этом разделе.
Когда файл открывается, создается объект потока, представляющий его в среде LISP. Все операции с потоком в основном эквивалентны операциям с файлом.
Синтаксис для open функция -
open filename &key :direction :element-type :if-exists :if-does-not-exist :external-format
где,
Имя файла аргумент является именем файла , который будет открыт или создан.
В ключевых слове аргументов определяют тип потока и обработки ошибок способов.
В :direction ключевое слово определяет, должен ли поток обрабатывать ввод, вывод или оба, оно принимает следующие значения:
: input - для входных потоков (значение по умолчанию)
: output - для выходных потоков
: io - для двунаправленных потоков
: probe - просто проверить наличие файлов; поток открывается, а затем закрывается.
В :element-type указывает тип единицы транзакции для потока.
В :if-existsАргумент указывает действие, которое необходимо предпринять, если: direction: output или: io и файл с указанным именем уже существует. Если направление: input или: probe, этот аргумент игнорируется. Принимает следующие значения -
: error - сигнализирует об ошибке.
: new-version - создает новый файл с тем же именем, но с большим номером версии.
: rename - переименовывает существующий файл.
: rename-and-delete - переименовывает существующий файл, а затем удаляет его.
: append - добавляет в существующий файл.
: supersede - заменяет существующий файл.
nil - он не создает файл или даже поток просто возвращает nil, чтобы указать на сбой.
В :if-does-not-existАргумент указывает действие, которое необходимо предпринять, если файл с указанным именем еще не существует. Принимает следующие значения -
: error - сигнализирует об ошибке.
: create - создает пустой файл с указанным именем и затем использует его.
nil - он не создает файл или даже поток, а просто возвращает nil, чтобы указать на сбой.
В :external-format Аргумент определяет признанную реализацией схему представления символов в файлах.
Например, вы можете открыть файл с именем myfile.txt, хранящийся в папке / tmp, как -
(open "/tmp/myfile.txt")
Запись в файлы и чтение из них
В with-open-fileпозволяет читать или записывать в файл, используя переменную потока, связанную с транзакцией чтения / записи. После завершения работы файл автоматически закрывается. Очень удобно пользоваться.
Он имеет следующий синтаксис -
with-open-file (stream filename {options}*)
{declaration}* {form}*
filename - имя файла, который нужно открыть; это может быть строка, путь или поток.
Эти параметры такие же , как ключевое слово аргументы функции открытым.
Пример 1
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(with-open-file (stream "/tmp/myfile.txt" :direction :output)
(format stream "Welcome to Tutorials Point!")
(terpri stream)
(format stream "This is a tutorials database")
(terpri stream)
(format stream "Submit your Tutorials, White Papers and Articles into our Tutorials Directory.")
)
Обратите внимание, что все функции ввода-вывода, описанные в предыдущей главе, такие как terpri и format, работают для записи в файл, который мы создали здесь.
Когда вы выполняете код, он ничего не возвращает; однако наши данные записываются в файл. В:direction :output ключевые слова позволяют нам это сделать.
Однако мы можем читать из этого файла, используя read-line функция.
Пример 2
Создайте новый файл исходного кода с именем main.lisp и введите в него следующий код.
(let ((in (open "/tmp/myfile.txt" :if-does-not-exist nil)))
(when in
(loop for line = (read-line in nil)
while line do (format t "~a~%" line))
(close in)
)
)
Когда вы выполняете код, он возвращает следующий результат -
Welcome to Tutorials Point!
This is a tutorials database
Submit your Tutorials, White Papers and Articles into our Tutorials Directory.
Закрытие файла
В close функция закрывает поток.