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 関数はストリームを閉じます。