Stream 公共Lisp输出文件流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

我在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" {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")) ...)