在Clisp中以二进制模式写入/读取文件

时间:2013-11-29 06:30:32

标签: file-io lisp common-lisp clisp line-endings

我正在编写这个应该从文件中读取的程序,对内容做一些事情并写入保存原始行结尾的输出文件。如果文件有CRLF个结尾,则输出文件也应具有该结尾​​。我的问题在于编写行结尾,尤其是CLISP实现(它与gcl一起使用)。当我尝试编写换行符(LF)时,该文件最终会有CRLF个结尾。我猜这与CLISP的实施有关 我需要一种方法来write the file in binary mode像其他语言一样。规范中的标准I / O函数仅采用可选的流名称和要写入的内容。

您可以使用以下内容重现该行为:

(with-open-file (out-file "test.dat" :direction :output)
  (setf ending #\linefeed)
  (princ "First Line" out-file)
  (write-char ending out-file)
  (princ "Second Line" out-file)
  (write-char ending out-file)
  (princ "Second Line" out-file))

我需要一个适用于Windows的解决方案。

1 个答案:

答案 0 :(得分:3)

您需要指定:EXTERNAL-FORMAT参数,并提及line terminator mode

(with-open-file (out-file "test.dat" :direction :output :external-format :unix)
  ...)

外部格式在Windows上默认为:dos,因为这是Microsoft系统的标准。

请注意,如果您实际编写文本,则需要二进制模式。在Common Lisp中(与C和Emacs Lisp相反),binary i/o(读写byte s)和文本i / o(到达和写入character}之间存在非常清晰的分离。 s),就像一个数字不是一个字符,反之亦然,即使字符有整数code