我正在编写这个应该从文件中读取的程序,对内容做一些事情并写入保存原始行结尾的输出文件。如果文件有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的解决方案。
答案 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。