2013-11-29 4 views
0

파일에서 읽어야하는이 프로그램을 작성 중이며 내용이있는 내용을 수행하고 원본 줄 끝을 출력 파일에 기록합니다. 파일에 CRLF 결말이있는 경우 출력 파일에도 해당 파일이 있어야합니다. 내 문제는 CLISP 구현 (특히 gcl과 함께 사용)으로 끝나는 줄을 쓰는 데 있습니다. 줄 바꿈 문자 (LF)를 쓰려고하면 파일의 끝이 CRLF으로 끝납니다. 나는 이것이 CLISP의 구현과 관련이 있다고 생각합니다.
다른 langauages와 마찬가지로 write the file in binary mode으로가는 길을 필요로합니다. 사양의 표준 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)) 

. 즉, 마이크로 소프트 시스템의 표준이기 때문에 창에 :dos

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

외부 형식 기본값 :

답변

3

당신은 line terminator mode을 언급, :EXTERNAL-FORMAT 인수를 지정해야합니다.

실제로 텍스트를 쓰는 경우 이 아니고 이진 모드가 필요합니다. C와 Emacs Lisp와는 대조적으로 Common Lisp에서는 숫자가 문자가 아니 듯이 binary i/o (읽기와 쓰기 byte)과 텍스트 I/O (도달하고 쓰는 character) 사이의 명확한 분리가 있습니다. 문자가 정수 code 인 경우에도 마찬가지입니다.

+0

왜이 경우 바이너리 모드에서 읽기가 느려야합니까? 그리고 유지할 수없는 방법? – Segfault

+1

은 시스템 기능을 수동으로 다시 구현하기 때문에 발생합니다. 그렇게하고 싶다면 어셈블리를 사용하십시오 :-) – sds

+0

hehe. 나는이 접근법을 더 좋아한다. 훨씬 더 간단합니다. – Segfault