Lisp-file-io
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
どこで、
- _filename_引数は、開くまたは作成するファイルの名前です。
- _keyword_引数は、ストリームのタイプとエラー処理方法を指定します。
- *: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_は、開くファイルの名前です。文字列、パス名、またはストリームの場合があります。 *_options_は、関数openのキーワード引数と同じです。
例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* 関数はストリームを閉じます。