Function FILE-POSITION

UP


Function FILE-POSITION

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-positionstreamの現在のファイルの位置を返却し、 もしそれが決定できないときはnilを返却します。

position-specが指定されたとき、 streamのファイルの位置が(可能であれば)設定されます。 もし位置の変更が正しく行われたとき、 file-positiontrueを返却し、 そうでなかったときはfalseを返却します。

file-positionがひとつの引数のときの返却された整数値は、 同じファイルにposition-specとして使用できるように 受け入れなければなりません。

文字型のファイルのとき、 read-charwrite-charの一回の操作による実行は、 文字セットの変換や(そのような変換には、 Common Lispの#\Newline文字と外部のASCII文字である、 キャリッジリターン・ラインフィードの列のような 二つの間の変換があります)、 その他の実装の仕様により、 ファイルの位置が1より大きな値で増加するかもしれません。 バイナリファイルのとき、 read-bytewrite-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
                         :if-exists :error)
         (notice (file-position s)) ;1
         (write-byte 5 s) 
         (write-byte 6 s)
         (let ((p (file-position s)))
           (notice p) ;2
           (notice (when p (file-position s (1- p))))) ;3
         (write-byte 7 s)
         (notice (file-position s)) ;4
         (setq file-written (truename s)))
       (with-open-file (s file-written
                          :element-type '(unsigned-byte 8)
                          :direction :input)
         (notice (file-position s)) ;5
         (let ((length (file-length s)))
           (notice length) ;6
           (when length
             (dotimes (i length)
               (notice (read-byte s)))))) ;7,...
       (nreverse noticed))))
=>  tester
(tester)
=>  (0 2 T 2 0 2 5 7)
OR=>  (0 2 NIL 3 0 3 5 6 7)
OR=>  (NIL NIL NIL NIL NIL NIL)

副作用

引数にposition-specが指定されたとき、 streamのファイル位置はおそらく移動します。

影響

file-positionによる返却値は、 入出力の操作が実行されるたびに単調に増加します。

例外

position-specが指定されたとき、その値が大きすぎるか、 あるいはその他の理由で適用できなかったときはエラーが発生します。

参考

file-length, file-string-length, open

備考

文字ファイルを一定のサイズのレコードの列として表現する実装では、 例えば<<レコード番号>>*<最大レコードサイズ>>+<レコード内の文字>>のように ファイル位置を算出することができるかもしれません。 これは各文字の読み書きに応じて単調に増加するため有効な計算です。 ただし、各ステップで必ずしも1ずつ増えるわけではありません。 もし、ある整数をレコード番号と文字番号をもとに算出したとき、 与えられたレコードが指定された文字番号に対して短すぎることが判明すれば、 その整数値はfile-positionposition-specとして 「不適切」とみなされるかもしれません。


TOP, Github