Tcl – ファイルの入出力(7) -seek,tell-

この記事ではファイルのアクセス位置を変更するseekコマンドと現在のアクセス位置を取得するtellコマンドの使い方を紹介します。

seekコマンドとtellコマンド

[書式]

seek channelId offset ?origin?

seekコマンドはchannelIdのアクセス位置を変更します。

offsetoriginchannelIdの次の読み書きを行う位置を指定します。offsetは整数でなければならず(負数でもよい)、originは次のいずれかでなければならない。

start
新しいアクセス位置は、ファイルの先頭からoffsetで指定したバイト位置になります。

current
新しいアクセス位置は、現在のアクセス位置からoffsetで指定したバイト位置になります。offsetに負数を指定すると、アクセス位置を後方に移動させます。

end
新しいアクセス位置は、ファイルの末尾からoffsetで指定したバイト位置になります。負数を指定すると、ファイルの終端の手前にアクセス位置を置き、正数を指定すると、ファイルの終端の後ろに置きます。

originのデフォルト値はstartです。このコマンドは空文字列を返します。

メモ

注意
offsetで指定する値は文字数ではなくバイト数です。readコマンドと違い文字ではなくバイトの観点で動作します。

[書式]

tell channelId

tellコマンドは、channelIdの現在位置を返します。seekをサポートしないチャネルの場合、-1 を返します。このコマンドも、文字ではなくバイトの観点で動作します。

※ファイルは前回の、str.txt を使用します。

Hello! Hello!
Good morning!
Bye bye!
Have a nice day!
こんにちわ
おはようございます。
バイバイ
よい1日を!

[使用例]

$ tclsh

# open時。
% set fid [open str.txt r]
file5
% tell $fid
0

# 3バイト進めて出力する。
% seek $fid 3
% puts [gets $fid]
lo! Hello!
% tell $fid
14

# 残りを出力する。
% puts [read -nonewline $fid]
Good morning!
Bye bye!
Have a nice day!
こんにちわ
おはようございます。
バイバイ
よい1日を!

% tell $fid
131

上の例は、3バイト進めた位置から1行分の出力を行い、残りをreadコマンドで出力しています。

ファイルの入出力(3) のrw6a.tclで文字数の総数を数えるプログラムを紹介しましたが、最後のtellコマンドの結果は、文字数の総数より値が多く、文字ではなくバイトの観点で動作していることが分かります。

コメント

タイトルとURLをコピーしました