文件I/O
我们已经了解如何使用标准的输入和输出是由Common Lisp处理的参数。所有这些函数读取和写入文本文件和二进制文件。唯一不同的是在这种情况下,我们使用流不是标准输入或输出,但对于写入或读取文件的特定目的的流创建的。
在本章中,我们将看到的LISP如何创建,打开,关闭文本或二进制文件的数据存储。
文件代表一个字节序列,如果它是一个文本文件或二进制文件。本章将引导完成重要的功能/宏的文件管理。
打开文件
可以使用open 函数来创建一个新文件或打开一个现有的文件。这是最基本的功能为打开一个文件。然而,with-open-file通常更方便,更常用,因为我们将在本节后面看。
当一个文件被打开,一个流对象被创建来代表它在LISP环境。流上的所有操作基本上等同于操作上的文件。
open 函数语法是:
open filename &key :direction :element-type :
if-exists :if-does-not-exist :external-format
那么,
filename 参数是要打开或创建的文件的名称。
keyword 参数指定的数据流和错误处理方式的类型。
:direction keyword 指定的流是否应处理的输入,输出,或两者兼而有之,它采用下列值:
:if-does-not-exist 参数指定,如果指定名称的文件已经不存在应采取的操作。它采用下列值:
- :external-format 参数指定用于表示文件的字符的实施认可制度
例如,可以打开一个名为myfile.txt的存储在/ tmp文件夹的文件:
(open "/tmp/myfile.txt")
写入和读取文件
with-open-file允许读取或写入到一个文件中,用与读/写事务相关联的流变量。一旦这项工作完成后,它会自动关闭文件。它使用极为方便。
它的语法如下:
with-open-file (stream filename {options}\*)
{declaration}\* {form}\*
示例 1
创建一个名为main.lisp一个新的源代码文件,并在其中输入如下代码:
(with-open-file (stream "/tmp/myfile.txt" :direction :output)
(format stream "Welcome to Tutorials Yiibai!")
(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一个新的源代码文件,并在其中输入如下代码:
(adsbygoogle = window.adsbygoogle || \[\]).push({});
(adsbygoogle = window.adsbygoogle || \[\]).push({});
(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 Yiibai!
This is a tutorials database
Submit your Tutorials, White Papers and Articles into our Tutorials Directory.
关闭文件
close函数关闭一个流。