File I/O
我们已经讨论了常见LISP如何处理标准输入和输出。 所有这些函数也可用于读取和写入文本和二进制文件。 唯一不同的是,在这种情况下,我们使用的流不是标准输入或输出,而是为写入或读取文件的特定目的而创建的流。
在本章中,我们将了解LISP如何为其数据存储创建,打开,关闭文本或二进制文件。
文件表示一个字节序列,如果它是文本文件或二进制文件则无关紧要。 本章将引导您完成文件管理的重要功能/宏。
打开文件
您可以使用open函数创建新文件或打开现有文件。 它是打开文件的最基本功能。 但是, with-open-file通常更方便,更常用,我们将在本节后面看到。
打开文件时,将构造流对象以在LISP环境中表示它。 流上的所有操作基本上等同于文件上的操作。
open函数的语法是 -
open filename &key :direction :element-type :if-exists :if-does-not-exist :external-format
Where,
filename参数是要打开或创建的文件的名称。
keyword参数指定流的类型和错误处理方式。
:direction关键字指定流是应该处理输入,输出还是两者,它采用以下值 -
:input - 用于输入流(默认值)
:output - 用于输出流
:io - 用于双向流
:probe - 用于检查文件是否存在; 流被打开然后关闭。
:element-type指定流的事务单元的类型。
:if-exists参数指定在:direction为:output或:io时要采取的操作,并且指定名称的文件已存在。 如果方向是:input或:probe,则忽略此参数。 它需要以下值 -
:错误 - 它发出错误信号。
:new-version - 它创建一个具有相同名称但版本号较大的新文件。
:rename - 重命名现有文件。
:rename-and-delete - 重命名现有文件,然后将其删除。
:append - 它附加到现有文件。
:supersede - 它取代现有文件。
nil - 它不会创建文件,甚至流也只返回nil表示失败。
:if-does-not-exist参数指定在指定名称的文件尚不存在时要采取的操作。 它需要以下值 -
:错误 - 它发出错误信号。
:create - 它创建一个具有指定名称的空文件,然后使用它。
nil - 它不会创建文件甚至是流,而只是返回nil来指示失败。
:external-format参数指定用于表示文件中字符的实现识别方案。
例如,您可以打开存储在/ tmp文件夹中的名为myfile.txt的文件 -
(open "/tmp/myfile.txt")
写入和读取文件
with-open-file允许使用与读/写事务关联的流变量读取或写入文件。 作业完成后,它会自动关闭文件。 使用起来非常方便。
它具有以下语法 -
with-open-file (stream filename {options}*)
{declaration}* {form}*
filename是要打开的文件的名称; 它可以是字符串,路径名或流。
options与open函数的关键字参数相同。
例子1 (Example 1)
创建一个名为main.lisp的新源代码文件,并在其中键入以下代码。
(with-open-file (stream "/tmp/myfile.txt" :direction :output)
(format stream "Welcome to IOWIKI!")
(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函数从这个文件中read-line 。
例子2 (Example 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 IOWIKI!
This is a tutorials database
Submit your Tutorials, White Papers and Articles into our Tutorials Directory.
关闭文件
close函数关闭一个流。