Запись/чтение файла в бинарном режиме в Clisp

Я пишу эту программу, которая должна читать из файла, что-то делать с содержимым и записывать в выходной файл, сохраняя исходные окончания строк. Если файл имеет CRLF окончание, выходной файл также должен иметь это. Моя проблема заключается в написании строки, заканчивающейся, особенно с реализацией CLISP (она работает с gcl). Когда я пытаюсь написать символ перевода строки (LF), файл заканчивается CRLF. Я предполагаю, что это как-то связано с реализацией CLISP.
Мне нужен способ write the file in binary mode, как в других языках. Стандартные функции ввода-вывода в спецификации принимают только необязательное имя потока и записываемое содержимое.

Вы можете воспроизвести это поведение примерно так:

(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.


person Plakhoy    schedule 29.11.2013    source источник


Ответы (1)


Вам необходимо указать аргумент :EXTERNAL-FORMAT, упомянув режим разделителя строк:

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

Внешний формат по умолчанию равен :dos в Windows, потому что это стандарт в системах Microsoft.

Обратите внимание, что вам не нужен двоичный режим, если вы на самом деле пишете текст. В Common Lisp (в отличие от C и Emacs Lisp) существует очень четкое разделение между двоичным и/ o (чтение и запись bytes) и текстовый ввод-вывод (достижение и запись characters), точно так же, как число не является символом и наоборот, даже если символы имеют целое число код.

person sds    schedule 29.11.2013
comment
Почему в этом случае чтение в двоичном режиме должно быть медленнее? И, неподдерживаемый как? - person Plakhoy; 29.11.2013
comment
потому что вы заново реализуете функциональность системы вручную. если вы хотите сделать это, используйте сборку :-) - person sds; 29.11.2013
comment
хе-хе. Такой подход мне нравится больше; это намного проще. - person Plakhoy; 29.11.2013