📜  LISP-文件I / O

📅  最后修改于: 2020-11-03 07:19:52             🧑  作者: Mango


我们讨论了普通LISP如何处理标准输入和输出。所有这些功能也可用于读取和写入文本和二进制文件。在这种情况下,唯一的区别是我们使用的流不是标准的输入或输出,而是为写入或读取文件的特定目的而创建的流。

在本章中,我们将了解LISP如何创建,打开,关闭文本或二进制文件进行数据存储。

文件表示字节序列,无论是文本文件还是二进制文件都没有关系。本章将带您了解文件管理的重要功能/宏。

开启档案

您可以使用打开函数来创建新文件或打开现有文件。它是打开文件的最基本函数。但是, with-open-file通常更方便且更常用,正如我们将在本节后面看到的那样。

打开文件后,将在LISP环境中构造一个流对象来表示它。流上的所有操作基本上等同于文件上的操作。

打开函数的语法是-

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

哪里,

  • filename参数是要打开或创建的文件的名称。

  • 关键字参数指定流的类型和错误处理方式。

  • :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参数指定一种实现认可的方案,用于表示文件中的字符。

例如,您可以打开存储在/ tmp文件夹中的名为myfile.txt的文件,格式为-

(open "/tmp/myfile.txt")

写入和读取文件

with-open-file允许使用与读/写事务关联的流变量来读取或写入文件。作业完成后,它将自动关闭文件。使用起来非常方便。

它具有以下语法-

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • filename是要打开的文件的名称;它可以是字符串,路径名或流。

  • 选项与函数open的关键字参数相同。

例子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.

关闭文件

关闭函数关闭流。