- LISP 教程
- LISP - 首页
- LISP - 概述
- LISP - 环境
- LISP - 程序结构
- LISP - 基本语法
- LISP - 数据类型
- LISP - 宏
- LISP - 变量
- LISP - 常量
- LISP - 运算符
- LISP - 决策
- LISP - 循环
- LISP - 函数
- LISP - 谓词
- LISP - 数字
- LISP - 字符
- LISP - 数组
- LISP - 字符串
- LISP - 序列
- LISP - 列表
- LISP - 符号
- LISP - 向量
- LISP - 集合
- LISP - 树
- LISP - 哈希表
- LISP - 输入与输出
- LISP - 文件 I/O
- LISP - 结构体
- LISP - 包
- LISP - 错误处理
- LISP - CLOS (Common Lisp Object System)
- LISP 有用资源
- Lisp - 快速指南
- Lisp - 有用资源
- Lisp - 讨论
LISP - 文件 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** 关键字指定流是否应处理输入、输出或两者兼而有之,它采用以下值:
: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 是要打开的文件的名称;它可以是字符串、路径名或流。
options 与 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.
关闭文件
**close** 函数关闭流。