Function FILE-POSITION
file-position
stream => position
file-position
stream position-spec => success-p
stream - ストリーム
position-spec - ファイルの位置指定子 position - ファイルの位置か、nil
success-p - generalized-boolean
stream内の現在の位置について、返却を行うか変更を行います。
position-specが指定されていないとき、 file-position
はstreamの現在のファイルの位置を返却し、 もしそれが決定できないときはnil
を返却します。
position-specが指定されたとき、 streamのファイルの位置が(可能であれば)設定されます。 もし位置の変更が正しく行われたとき、 file-position
はtrueを返却し、 そうでなかったときはfalseを返却します。
file-position
がひとつの引数のときの返却された整数値は、 同じファイルにposition-specとして使用できるように 受け入れなければなりません。
文字型のファイルのとき、 read-char
かwrite-char
の一回の操作による実行は、 文字セットの変換や(そのような変換には、 Common Lispの#\Newline
文字と外部のASCII文字である、 キャリッジリターン・ラインフィードの列のような 二つの間の変換があります)、 その他の実装の仕様により、 ファイルの位置が1
より大きな値で増加するかもしれません。 バイナリファイルのとき、 read-byte
かwrite-byte
の全ての操作は、 ファイルの位置が1
だけ増加します。
defun tester ()
(let ((noticed '()) file-written)
(flet ((notice (x) (push x noticed) x))
(with-open-file (s "test.bin"
(:element-type '(unsigned-byte 8)
:direction :output
:error)
:if-exists file-position s)) ;1
(notice (write-byte 5 s)
(write-byte 6 s)
(let ((p (file-position s)))
(;2
(notice p) when p (file-position s (1- p))))) ;3
(notice (write-byte 7 s)
(file-position s)) ;4
(notice (setq file-written (truename s)))
(with-open-file (s file-written
(:element-type '(unsigned-byte 8)
:direction :input)
file-position s)) ;5
(notice (let ((length (file-length s)))
(length) ;6
(notice when length
(dotimes (i length)
(read-byte s)))))) ;7,...
(notice (nreverse noticed))))
(=> tester
(tester)=> (0 2 T 2 0 2 5 7)
0 2 NIL 3 0 3 5 6 7)
OR=> ( OR=> (NIL NIL NIL NIL NIL NIL)
引数にposition-specが指定されたとき、 streamのファイル位置はおそらく移動します。
file-position
による返却値は、 入出力の操作が実行されるたびに単調に増加します。
position-specが指定されたとき、その値が大きすぎるか、 あるいはその他の理由で適用できなかったときはエラーが発生します。
file-length
, file-string-length
, open
文字ファイルを一定のサイズのレコードの列として表現する実装では、 例えば<<レコード番号>>*<最大レコードサイズ>>+<レコード内の文字>>
のように ファイル位置を算出することができるかもしれません。 これは各文字の読み書きに応じて単調に増加するため有効な計算です。 ただし、各ステップで必ずしも1ずつ増えるわけではありません。 もし、ある整数をレコード番号と文字番号をもとに算出したとき、 与えられたレコードが指定された文字番号に対して短すぎることが判明すれば、 その整数値はfile-position
のposition-specとして 「不適切」とみなされるかもしれません。