2013-11-29 106 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

相關問題