2013-11-29 72 views
0

我正在编写这个应该从文件中读取的程序,对内容做一些操作并写入输出文件以保留原始行尾。如果文件有CRLF结尾,输出文件也应该有。我的问题在于编写以CLISP实现为结尾的行(它与gcl一起使用)。当我尝试写入换行字符(LF)时,该文件最终会以CRLF结尾。我猜这与CLISP的实施有关。
我需要一种方式来write the file in binary mode像其他langauages。规范中的标准I/O函数仅采用可选的流名称和要写入的内容。在Clisp中以二进制模式写入/读取文件

您可以重现行为像这样的东西:

(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上运行的解决方案。

回答

3

你需要指定:EXTERNAL-FORMAT说法,提line terminator mode:在Windows

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

外部格式默认为:dos,因为这是对微软系统的标准。

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

+0

为什么在这种情况下读取二进制模式会更慢?而且,不可维护的如何? – Segfault

+1

,因为您正在手动重新实现系统功能。如果你想这样做,使用汇编:-) – sds

+0

呵呵。我更喜欢这种方法;它更简单。 – Segfault

相关问题