| Development Environment | ![]() |
ファイル内の位置の制御
fopenを使ってファイルをオープンすると、MATLABは、ファイル内の特定の位置を指定するファイルポジションインジケータを保持します。MATLABは、このファイルポジションインジケータを使って、次にファイル内のどの場所から読み、書きするのかを決定します。以下の節では、ファイル内で操作を開始する位置を制御するためのノウハウを紹介します。
ファイルの終端の決定
関数fseek とftell は、ファイル内で次に入出力操作を行う位置の設定、検索に使用する関数です。
fseekは、データをスキップしたり、ファイルの前の方に移動するといった操作によって、ファイルポジションを再設定する関数です。 ftellは、指定したファイルについて、ファイルポジションインジケータのオフセットをバイト単位で出力します。 status = fseek(fid,offset,origin)
fid は、対象ファイルのファイル識別子です。offset は、正または負のオフセット値で、バイト単位で指定します。 origin は、移動量を計算する際の原点となる値で、文字列で指定します。
|
ファイルの最初 |
|
ファイルの中のカレントの位置 |
|
ファイルの末尾 |
ファイルポジションの識別
関数fseek と ftell が、どのように機能するのかについて、次の簡単なM-ファイル考えてみましょう。
A = 1:5;
fid = fopen('five.bin','w');
fwrite(fid, A,'short');
status = fclose(fid);
このコードは、1から5までの数字をバイナリファイルfive.binに書き込む操作を行います。関数fwrite を呼び出すときに、書き込む数値要素はshortで格納するように設定しています。その結果、それぞれの数字は、2ストレージバイトを使用することになります。
ここで、 five.bin を読み取り専用で再びオープンします。
fid = fopen('five.bin','r');
ここで、fseek を使って、ファイルポジションインジケータをファイルの冒頭から前に6バイトだけ進めてみましょう
status = fseek(fid,6,'bof');
| ファイル内の位置 |
bof |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
eof |
| ファイルの内容 |
|
0 |
1 |
0 |
2 |
0 |
3 |
0 |
4 |
0 |
5 |
|
| ファイルポジションインジケータ |
__![]() | |||||||||||
さらに、関数fread を使って、ファイル内の位置7と8で読み込んだ内容を変数fourに格納します。
four = fread(fid,1,'short');
読み込み操作により、ファイルポジションインジケータは前に進みます。カレントのファイルポジションインジケータの位置を知るために、関数ftellをコールします。
position = ftell(fid)
position =
8
| ファイル内の位置 |
bof |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
eof |
| ファイルの内容 |
|
0 |
1 |
0 |
2 |
0 |
3 |
0 |
4 |
0 |
5 |
|
| ファイルポジションインジケータ |
_![]() | |||||||||||
つぎに、fseek を使って、ファイルポジションインジケータを4バイトだけ後ろに戻します。
status = fseek(fid,-4,'cof');
| ファイル内の位置 |
bof |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
eof |
| ファイルの内容 |
|
0 |
1 |
0 |
2 |
0 |
3 |
0 |
4 |
0 |
5 |
|
| ファイルポジションインジケータ |
_![]() | |||||||||||
最後に、fread を再び呼び出して、つぎの値(3)を読み込みます。
three = fread(fid,1,'short');
| バイナリデータの書き込み | テキストファイルから文字列を1行ずつ読み込む | ![]() |