LISP-파일 I / O

표준 입력 및 출력이 공통 LISP에서 처리되는 방법에 대해 논의했습니다. 이 모든 함수는 텍스트 및 이진 파일을 읽고 쓰는데도 작동합니다. 이 경우 유일한 차이점은 우리가 사용하는 스트림은 표준 입력 또는 출력이 아니라 파일에 쓰거나 파일에서 읽는 특정 목적을 위해 생성 된 스트림입니다.

이 장에서는 LISP가 데이터 저장을 위해 텍스트 또는 바이너리 파일을 만들고, 열고, 닫는 방법을 알아 봅니다.

파일은 바이트 시퀀스를 나타내며 텍스트 파일이든 바이너리 파일이든 상관 없습니다. 이 장에서는 파일 관리를위한 중요한 기능 / 매크로에 대해 설명합니다.

파일 열기

당신은 사용할 수 있습니다 open새 파일을 만들거나 기존 파일을 여는 기능입니다. 파일을 여는 가장 기본적인 기능입니다. 그러나, 그with-open-file 이 섹션의 뒷부분에서 볼 수 있듯이 일반적으로 더 편리하고 일반적으로 사용됩니다.

파일이 열리면 LISP 환경에서이를 나타 내기 위해 스트림 객체가 구성됩니다. 스트림에 대한 모든 작업은 기본적으로 파일에 대한 작업과 동일합니다.

구문 open 함수는-

open filename &key :direction :element-type :if-exists :if-does-not-exist :external-format

어디,

  • 파일 이름 인수는 파일의 이름을 열거 나 만들 수있다.

  • 키워드 인수 스트림과 오류 처리 방법의 유형을 지정합니다.

  • 그만큼 :direction 키워드는 스트림이 입력, 출력 또는 둘 다를 처리해야하는지 여부를 지정하며 다음 값을 사용합니다.

    • : input-입력 스트림 용 (기본값)

    • : output-출력 스트림 용

    • : io-양방향 스트림 용

    • : probe-파일 존재 여부를 확인합니다. 스트림이 열렸다가 닫힙니다.

  • 그만큼 :element-type 스트림의 트랜잭션 단위 유형을 지정합니다.

  • 그만큼 :if-exists인수는 : direction이 : output 또는 : io이고 지정된 이름의 파일이 이미 존재하는 경우 취할 조치를 지정합니다. 방향이 : input 또는 : probe 인 경우이 인수는 무시됩니다. 다음 값을 취합니다-

    • : error-오류를 나타냅니다.

    • : new-version-이름은 같지만 버전 번호가 더 큰 새 파일을 만듭니다.

    • : rename-기존 파일의 이름을 바꿉니다.

    • : rename-and-delete-기존 파일의 이름을 바꾼 다음 삭제합니다.

    • : append-기존 파일에 추가합니다.

    • : supersede-기존 파일을 대체합니다.

    • nil-파일을 생성하지 않거나 심지어 스트림이 실패를 나타 내기 위해 nil을 반환합니다.

  • 그만큼 :if-does-not-exist인수는 지정된 이름의 파일이 아직 존재하지 않는 경우 취할 조치를 지정합니다. 다음 값을 취합니다-

    • : error-오류를 나타냅니다.

    • : create-지정된 이름으로 빈 파일을 만든 다음 사용합니다.

    • nil-파일이나 스트림을 생성하지 않고 실패를 나타 내기 위해 단순히 nil을 반환합니다.

  • 그만큼 :external-format 인수는 파일에서 문자를 표현하기위한 구현 인식 체계를 지정합니다.

예를 들어, 다음과 같이 / tmp 폴더에 저장된 myfile.txt라는 파일을 열 수 있습니다.

(open "/tmp/myfile.txt")

파일 쓰기 및 읽기

그만큼 with-open-file읽기 / 쓰기 트랜잭션과 연관된 스트림 변수를 사용하여 파일을 읽거나 쓸 수 있습니다. 작업이 완료되면 파일이 자동으로 닫힙니다. 사용하기 매우 편리합니다.

다음과 같은 구문이 있습니다.

with-open-file (stream filename {options}*)
   {declaration}* {form}*
  • filename 은 열 파일의 이름입니다. 문자열, 경로 이름 또는 스트림 일 수 있습니다.

  • 옵션은 함수 열려면 키워드 인자와 동일합니다.

예 1

main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.

(with-open-file (stream "/tmp/myfile.txt" :direction :output)
   (format stream "Welcome to Tutorials Point!")
   (terpri stream)
   (format stream "This is a tutorials database")
   (terpri stream)
   (format stream "Submit your Tutorials, White Papers and Articles into our Tutorials   Directory.")
)

terpri 및 format과 같이 이전 장에서 설명한 모든 입력-출력 함수는 여기서 만든 파일에 쓰기 위해 작동합니다.

코드를 실행하면 아무 것도 반환하지 않습니다. 그러나 우리의 데이터는 파일에 기록됩니다. 그만큼:direction :output 키워드를 사용하면이를 수행 할 수 있습니다.

그러나 우리는이 파일에서 read-line 함수.

예 2

main.lisp라는 새 소스 코드 파일을 만들고 그 안에 다음 코드를 입력합니다.

(let ((in (open "/tmp/myfile.txt" :if-does-not-exist nil)))
   (when in
      (loop for line = (read-line in nil)
      
      while line do (format t "~a~%" line))
      (close in)
   )
)

코드를 실행하면 다음 결과가 반환됩니다.

Welcome to Tutorials Point!
This is a tutorials database
Submit your Tutorials, White Papers and Articles into our Tutorials Directory.

파일 닫기

그만큼 close 함수는 스트림을 닫습니다.