この記事ではファイルのアクセス位置を変更するseekコマンドと現在のアクセス位置を取得するtellコマンドの使い方を紹介します。
seekコマンドとtellコマンド
[書式]
seek channelId offset ?origin?
seekコマンドはchannelIdのアクセス位置を変更します。
offsetとoriginはchannelIdの次の読み書きを行う位置を指定します。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コマンドの結果は、文字数の総数より値が多く、文字ではなくバイトの観点で動作していることが分かります。
コメント