C言語 ファイル処理 ランダムの読み書き

このページは、ファイル処理の流れ を読んでおくと
理解しやすくなります。


ファイルの読み込みや書き込みは、
ファイルの先頭からじゃなくても処理可能です。

例)ファイルの先頭から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