代码之家  ›  专栏  ›  技术社区  ›  jcubic

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

  •  0
  • jcubic  · 技术社区  · 5 年前

    我的代码有问题,我无法使用二进制端口保存换行符,我想为我的方案实现编写单元测试,但我无法找出为什么我在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" .

    “你好,世界” 没有新线。

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

    0 回复  |  直到 5 年前
        1
  •  1
  •   user5920214 user5920214    5 年前

    一个换行符保存到文件中:使用 od 或者有什么东西会告诉你的。

    不管你的逻辑如何 文件不正确:您从未对读取的最后一个字符执行任何操作。如果你改写(说)

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