Stream 公共Lisp输出文件流SBCL
我在debian的SBCL上 出于某种原因,如果我使用此选项:Stream 公共Lisp输出文件流SBCL,stream,lisp,common-lisp,sbcl,Stream,Lisp,Common Lisp,Sbcl,我在debian的SBCL上 出于某种原因,如果我使用此选项: (with-open-file (output (open #p"file.txt" :direction :output :if-exists :overwrite)) (format output "test"))) 其中file.txt是纯文本文件 我得到了错误 #<SB-SYS:FD-STREAM for "file /home/me/file.txt
(with-open-file (output (open #p"file.txt"
:direction :output
:if-exists :overwrite))
(format output "test")))
其中file.txt
是纯文本文件
我得到了错误
#<SB-SYS:FD-STREAM for "file /home/me/file.txt" {1004A90813}> is not
a character output stream.
#不是
字符输出流。
即使使用:element type'字符
也不能保存我。我无法通过任何方法打开任何输出流。如果我尝试使用写入位
,它会说它不是二进制输出流。其他写入函数也不能工作,例如写入序列
或写入行
。它们都返回这个错误。如何修复此问题?您对的使用不正确
(with-open-file (output #p"file.txt"
:direction :output
:if-exists :supersede)
(format output "Hello"))
我已经把重点说得很清楚了。这个问题实际上比人们想象的更棘手: 让我们看一下表格 第一个错误:它没有正确缩进。让我们缩进:
(with-open-file (output (open #p"file.txt"
:direction :output
:if-exists :overwrite))
(format output "test")))
现在我们可以看到更多的错误附加括号
(with-open-file (output (open #p"file.txt"
:direction :output
:if-exists :overwrite))
(format output "test"))) ; <- additional parenthesis
上面打开一个用于写入输出的文件并返回一个流
WITH-OPEN-FILE
也会打开文件因此您尝试打开文件两次,第一次用于写入
(with-open-file (output stream)
(format output "test")))
打开一个文件进行读取。您已打开该文件两次:先用于写入,然后用于读取。
现在您可以尝试使用格式写入输入流。
稍微让人吃惊的是:open
和with open file
都可以将文件流作为文件规范。如果它将文件流作为文件规范,那么关联的路径名将用于打开操作
因此,正如另一个答案中所提到的,这更为正确:
(with-open-file (output #p"file.txt"
:direction :output
:if-exists :supersede)
(format output "Hello"))
SBCL错误消息:
#<SB-SYS:FD-STREAM for "file /home/me/file.txt" {1004A90813}>
is not a character output stream.
你的额外问题:为什么以下表格有效
(with-open-file (input (open #p"file.txt")) ...)
它只需打开文件两次即可阅读。这很有趣,因为
(使用open file(input(open#p“file.txt))
工作正常。这是一个非常棒的、深思熟虑的回答,谢谢雷纳!
CL-USER 18 > (with-open-file (output (open #p"/tmp/file.txt"
:direction :output
:if-does-not-exist :create
:if-exists :overwrite))
(assert (output-stream-p output) (output)
"The stream ~a is not an output stream!"
output)
(format output "test"))
Error: The stream #<STREAM::LATIN-1-FILE-STREAM /tmp/file.txt>
is not an output stream!
(with-open-file (input (open #p"file.txt")) ...)