2012-05-05 5 views
0

파이썬 스크립트 중 일부를 Common Lisp으로 이식하고 있습니다. 일부 디렉토리에 파일 목록을 가져 와서 각 파일의 내용을 줄별로 인쇄해야합니다. 이 코드는 모든 파일 이름을 보여줍니다. 그러나 줄은 마지막 파일에만 인쇄됩니다. 왜? 또한, 파일 행을 반복하는 가장 좋은 방법은 무엇입니까? 감사합니다. .디렉토리의 파일 가져 오기, 줄 단위로 각 파일 인쇄

(dolist (file (directory (make-pathname :name :wild 
             :type :wild 
             :defaults "path\\to\\files\\"))) 
    (print file) 
    (with-open-file (stream file) 
    (do ((line (read-line stream) (read-line stream))) 
     (nil t) 
     (print line)))) 
+0

것 같아요, 그것은 최종 시험 형태입니다, 그것은 반환 전무입니다. –

+0

NIL은 항상 거짓입니다. 그것은 영원히 반복됩니다. 그게 니가 원하는거야? –

답변

1

주어진 경로와 스트림을 가진 파일을 인쇄하는 함수를 작성하는 것이 좋습니다.

DO으로 반복합니다. 괜찮아요,하지만 좀 더 쉽게 코드를 읽을 수 있도록 LOOP 같은 것을 사용할 것입니다.

DO은 무한 루프입니다. EOF에 도달하면 루프를 종료 할 수 있습니다.

READ-LINE은 파일의 끝 부분을 읽을 때 오류가 발생합니다. 따라서 코드는 첫 번째 파일의 끝에 오류를 신호합니다. 이 오류로 인해 첫 번째 파일 만 인쇄됩니다.

READ-LINE을 호출해야 EOF를 테스트하고 반복을 끝내야합니다. 인수는 READ-LINE을 참조하십시오. 또는 EOF 오류를 포착 할 수 있지만 다른 솔루션은 약간 쉽습니다.

0

이 나를 위해 작동하는 것 같다 :

(dolist (file (directory (make-pathname :name :wild 
              :defaults "/tmp/lt/files/"))) 
    (print file) 
    (with-open-file (stream file) 
     (do ((line (read-line stream nil) (read-line stream nil))) 
     ((null line)) 
     (print line)))) 
+0

감사합니다.이 코드는 작동합니다! –