このページは、ファイル処理の流れ を読んでおくと
理解しやすくなります。
ファイルの読み込みや書き込みは、
ファイルの先頭からじゃなくても処理可能です。
例)ファイルの先頭から20バイト目のデータを読み込みたい。等
例)ファイルの先頭から5バイト目にデータを書き込みたい。等
このような処理をランダム処理と言います。
めんどくさそうですが、実際には、読み込むポイント、
または書き込むポイントを指定してから読み込み、書き込みを行うだけです。
ランダムの読み込み処理
読み込み用ファイル:text.txt
star123hosi |
プログラムファイル:program.c
#include <stdio.h>
void main(void) {
FILE* fp;
char ss[5];
fp = fopen("text.txt", "rb");
fseek(fp, 0L, SEEK_SET);
fscanf(fp, "%4c", ss);
ss[4] = '\0';
printf("%s\n", ss);
fseek(fp, 7L, SEEK_SET);
fscanf(fp, "%4c", ss);
ss[4] = '\0';
printf("%s\n", ss);
fclose(fp);
}
読み込み用ファイル:text.txt を読み込んで、先頭から1~4文字目、
先頭から8~11文字目のデータを表示するプログラムです。
fseek関数では、読み込む位置を指定しています。
fseek(fp, 0L, SEEK_SET);
第2引数は、第2引数で指定した場所から数えて何番目かを指定します。
第3引数は、ファイルのアクセスする基準点を指定します。
この場合は、SEEK_SET とあるので、
ファイルの先頭からという意味になっています。
そして、第2引数は0なので、
アクセスする場所を「ファイルの先頭から0番目」に指定した。
と言う事になります。
ファイルの先頭は、1文字目ではなく0文字目から始まります。
そして、fscanf 関数で、4文字読み込んで、それぞれ表示しています。
fscanf(fp, "%4c", ss);
この場合は、単に4文字読み込むだけなので、
文字列終端文字(\0)を手動で追加しています。
出力は、以下のようになります。
star hosi |
ランダムの書き込み処理
書き込み用ファイル:text.txt
star123hosi |
プログラムファイル:program.c
#include <stdio.h>
void main(void) {
FILE* fp;
fp = fopen("text.txt", "r+");
fseek(fp, 4L, SEEK_SET);
fprintf(fp, "%s", "789");
fclose(fp);
}
書き込み用ファイル:text.txt の5~7文字目にデータ789を書き込む
プログラムです。
ファイルを追加書き込み用モードでオープンしています。
fp = fopen("text.txt", "r+");
ファイル内容は捨てずに読み書き可能なモードです。
なぜ “r+” なのかは分かりませんが、そういう仕様になっています。
続いて、書き込む位置を指定しています。
fseek(fp, 4L, SEEK_SET);
この場合は、ファイルの先頭から4番目と言う事になります。
そして、指定された書き込み位置からデータ 789 を書き込んでいます。
fprintf(fp, "%s", "789");
プログラム終了後のファイルの中身は、以下のようになります。
text.txt
star789hosi |