如何解决将尾随换行符作为字节写入 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 world\n"
。
奇怪的是,在我想要测试的 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))))
您将从文件中获取所有字符。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。