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

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

我正在编写这个程序,它应该从一个文件中读取,对内容进行一些处理,然后写入一个保留原始行结尾的输出文件。如果文件有 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/

相关文章:

java - 如何从输入文件获取二维数组看起来像字段

Java 程序读取文本文件并将其与用户输入进行比较

c - 在 C 中重新创建 STDIN 重定向

lisp - 谁能向我解释为什么这个 lisp 代码不起作用?

lisp - Common Lisp 存在哪些后台作业处理解决方案?

lisp - cl-who 在函数调用中传递流

lisp - 什么是萨克拉?

ruby - 更快的 CSV + 试图找到独特的项目

unit-testing - 在 Racket 中对程序使用单元测试

lisp - setf中的f代表什么?