我有一些代码,可以读取一个文件,并将其变成一个字符列表。
(define in (open-input-file "some-file.txt"))
(define (file->char-list inp)
;; convert the input file into a list of chars
(let ([content (read-char inp)])
(if (eof-object? content)
(list eof)
(cons content (file->char-list inp)))))
(define char-list (file->char-list in)
(println char-list)
read-syntax: bad syntax `#<`
'(#\s #\o #\m #\e #\space #\t #\e #\x #\t #<eof>)
但问题是文件中的eof给出了一个糟糕的语法错误。我需要eof在列表中,因为我打算用它来做一些事情,但我很惊讶我得到了这个错误,因为这些值是被引用的,而当我评估 eof
在补充我也得到#。有人知道我能做什么吗?
在典型的现代操作系统上,文件中没有文件结束符。相反,当通过一些文件IO操作达到文件结束时,操作系统会发出信号。为了使这个信号有效,必须返回一个唯一的值给IO操作的调用者,这个值可以从任何可能收到的有效数据中区分出来。在 Racket 的情况下,这个值就是 eof
,这是一个代表文件结束的独特值。
该 eof
对象被打印成一个 不可读物;你不希望读者在程序中间遇到文件结束的情况。当你进入 eof
在REPL,符号 'eof
评估为文件结束对象,通常会被打印成一个不可读的值,用 #<eof>
. 如果你想给 #<eof>
读者,比如说把它列入一个引用列表,并在列表中加入 '(#\s #\o #\m #\e #\space #\t #\e #\x #\t #<eof>)
,读者会抱怨。这是应该的。
我想不出上位者有什么理由需要与之合作。eof
对象,当达到文件结束时返回。OP也可以这样做。
(define (file->char-list inp)
;; convert the input file into a list of chars
(let ([content (read-char inp)])
(if (eof-object? content)
'()
(cons content (file->char-list inp)))))
当使用列表创建的时候
(define char-list (file->char-list in))
char-list ==> '(#\s #\o #\m #\e #\space #\t #\e #\x #\t)
创建的列表时,当到达列表的末端时,就知道已经到达了文件的末端。如果OP想 "改造 "一下 eof
以某种方式,一个新的字符可以简单地附加到列表的最后。