我正在编写这个程序,它应该从一个文件中读取,对内容进行一些处理,然后写入一个保留原始行结尾的输出文件。如果文件有 CRLF
结尾,输出文件也应该有。我的问题是编写以 CLISP
实现结尾的行(它适用于 gcl
)。当我尝试写入换行符 (LF
) 时,文件以 CRLF
结尾。我猜这与 CLISP
的实现有关。
我需要一种方法来以二进制模式编写文件
,就像在其他语言中一样。规范中的标准 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 的解决方案。
最佳答案
您需要指定 :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
)和文本 i/o(到达并写入 character
s),就像数字不是字符一样,反之亦然,即使字符具有整数 code .
关于file-io - 在 Clisp 中以二进制模式写入/读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20279695/