Учебники

LISP — File I / O

Мы обсудили, как стандартный ввод и вывод обрабатывается обычным LISP. Все эти функции также работают для чтения и записи в текстовые и двоичные файлы. Единственное отличие состоит в том, что в этом случае используемый нами поток — это не стандартный ввод или вывод, а поток, созданный для конкретной цели записи или чтения из файлов.

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

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

Открытие файлов

Вы можете использовать функцию открытия, чтобы создать новый файл или открыть существующий файл. Это самая основная функция для открытия файла. Однако with-open-file обычно более удобен и более широко используется, как мы увидим позже в этом разделе.

Когда файл открывается, объект потока создается для его представления в среде LISP. Все операции с потоком в основном эквивалентны операциям с файлом.

Синтаксис для открытой функции —

open filename &key :direction :element-type :if-exists :if-does-not-exist :external-format

где,

  • Аргумент имени файла — это имя файла, который нужно открыть или создать.

  • Ключевое слово arguments указывает тип потока и способы обработки ошибок.

  • Ключевое слово : direction указывает, должен ли поток обрабатывать ввод, вывод или оба, он принимает следующие значения —

    • : input — для входных потоков (значение по умолчанию)

    • : output — для выходных потоков

    • : io — для двунаправленных потоков

    • : probe — для проверки наличия файлов; поток открывается, а затем закрывается.

  • Элемент : element-type указывает тип единицы транзакции для потока.

  • Аргумент : if-существующие указывает действие, которое необходимо предпринять, если: direction:: output или: io и файл с указанным именем уже существует. Если направление: input или: probe, этот аргумент игнорируется. Он принимает следующие значения —

    • : ошибка — сигнализирует об ошибке.

    • : new-version — создает новый файл с тем же именем, но большим номером версии.

    • : переименовать — переименовывает существующий файл.

    • : переименовать-и-удалить — переименовывает существующий файл и затем удаляет его.

    • : append — добавляет к существующему файлу.

    • : supersede — заменяет существующий файл

    • ноль — он не создает файл или даже поток просто возвращает ноль, чтобы указать сбой.

  • Аргумент : if-does-not- there указывает действие, которое необходимо предпринять, если файл с указанным именем еще не существует. Он принимает следующие значения —

    • : ошибка — сигнализирует об ошибке.

    • : create — создает пустой файл с указанным именем и затем использует его.

    • ноль — он не создает файл или даже поток, но вместо этого просто возвращает ноль, чтобы указать сбой.

  • Аргумент : external-format указывает распознаваемую реализацией схему для представления символов в файлах.

Аргумент имени файла — это имя файла, который нужно открыть или создать.

Ключевое слово arguments указывает тип потока и способы обработки ошибок.

Ключевое слово : direction указывает, должен ли поток обрабатывать ввод, вывод или оба, он принимает следующие значения —

: input — для входных потоков (значение по умолчанию)

: output — для выходных потоков

: io — для двунаправленных потоков

: probe — для проверки наличия файлов; поток открывается, а затем закрывается.

Элемент : element-type указывает тип единицы транзакции для потока.

Аргумент : if-существующие указывает действие, которое необходимо предпринять, если: direction:: output или: io и файл с указанным именем уже существует. Если направление: input или: probe, этот аргумент игнорируется. Он принимает следующие значения —

: ошибка — сигнализирует об ошибке.

: new-version — создает новый файл с тем же именем, но большим номером версии.

: переименовать — переименовывает существующий файл.

: переименовать-и-удалить — переименовывает существующий файл и затем удаляет его.

: append — добавляет к существующему файлу.

: supersede — заменяет существующий файл

ноль — он не создает файл или даже поток просто возвращает ноль, чтобы указать сбой.

Аргумент : if-does-not- there указывает действие, которое необходимо предпринять, если файл с указанным именем еще не существует. Он принимает следующие значения —

: ошибка — сигнализирует об ошибке.

: create — создает пустой файл с указанным именем и затем использует его.

ноль — он не создает файл или даже поток, но вместо этого просто возвращает ноль, чтобы указать сбой.

Аргумент : external-format указывает распознаваемую реализацией схему для представления символов в файлах.

Например, вы можете открыть файл с именем myfile.txt, хранящийся в папке / tmp, как —

(open "/tmp/myfile.txt")

Запись в и чтение из файлов

With -open-file позволяет читать или записывать в файл, используя переменную потока, связанную с транзакцией чтения / записи. Как только работа завершена, она автоматически закрывает файл. Это чрезвычайно удобно для использования.

Он имеет следующий синтаксис —

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • filename — имя файла, который нужно открыть; это может быть строка, путь или поток.

  • Параметры совпадают с ключевыми словами аргументов открытой функции.

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 позволяют нам сделать это.

Тем не менее, мы можем читать из этого файла, используя функцию чтения строки .

Пример 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 закрывает поток.