将尾随换行符作为字节写入Scheme中的二进制输出文件



我的代码有问题,我无法使用二进制端口保存换行符,我想为我的Scheme实现编写单元测试,但我无法弄清楚为什么我在Gambit和Kawa中也得到了这个结果(Gauche和Guile无法运行代码,因为缺少程序)。

(let ((fname "./tests/__x7__.scm")
(str "hello, world!n"))
(if (file-exists? fname)
(delete-file fname))
(let ((port (open-binary-output-file fname)))
(call-with-port port
(lambda (p)
(write-bytevector (string->utf8 str) p)))
(define output (with-input-from-file fname
(lambda ()
(let ((result (list)))
(do ((char (read-char) (read-char)))
((eof-object? (peek-char))
(apply string result))
(set! result (append result (list char))))))))
(write output)
(newline)))

我在文件中写入换行符,但在输出文件中,末尾没有换行符,当我读取文件时,我得到的是"hello world"而不是"hello worldn"

奇怪的是,在我的Scheme实现中,我想测试我也得到了没有换行符的"hello world"

如果字符串是"hello, world!nfoo bar",换行符被正确保存,为什么后面的换行符不被保存?

我错过了什么?为什么换行符不保存到文件中?

一个换行符被保存到文件中:使用od或其他选项检查文件会显示这个

然而你的逻辑读取文件是不正确的:你从来没有对你读的最后一个字符做任何事情。如果你写(比如说)

(let loop ((c (read-char)) (a '()))
(if (eof-object? c)
(list->string (reverse a))
(loop (read-char) (cons c a))))

您将从文件中获得所有字符。

相关内容

  • 没有找到相关文章

最新更新