C言語

【C言語】第7章第7回:ファイルのシーク操作


Warning: preg_match(): Compilation failed: regular expression is too large at offset 38197 in /home/wp769435/a-mun.com/public_html/wp-content/plugins/easy-table-of-contents/easy-table-of-contents.php on line 1806

ファイルシーク操作は、大規模なデータファイルを効率的に操作するために不可欠なスキルです。本記事では、C言語でのファイルシーク操作の基礎から応用までを学びます。

0. 記事の概要

この記事を読むメリット

  • 効率的なデータ操作:シーク操作により特定のデータに直接アクセスできます。
  • 応用力の向上:ランダムアクセスが求められる場面で役立ちます。
  • 実践的な知識:ファイル操作の高度なスキルを習得できます。

この記事で学べること

  • ファイルシーク操作の基本概念
  • C言語でのシーク操作の使用方法
  • 応用例と実践的なプログラム

活用のイメージ

例えば、ログファイルの特定の行にアクセスしたり、大容量ファイルの特定のデータを効率的に処理する際に、ファイルシーク操作が非常に有用です。

1. ファイルシーク操作の基礎

1.1 ファイルシークとは?

ファイルシークとは、ファイル内の特定の位置に直接移動する操作のことです。C言語ではfseek()ftell()関数を使用します。

1.2 fseek()の基本

fseek()関数は、以下の形式で使用されます。

int fseek(FILE *stream, long offset, int origin);

パラメータ:

  • stream:操作対象のファイルポインタ
  • offset:移動量(バイト単位)
  • origin:基準位置(SEEK_SET, SEEK_CUR, SEEK_END

1.3 ftell()の基本

ftell()関数は、現在のファイル位置を取得します。

long ftell(FILE *stream);

使用例:現在の位置を表示します。

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    fseek(file, 0, SEEK_SET); // ファイルの先頭に移動
    long position = ftell(file); // 現在の位置を取得
    printf("Current position: %ld\n", position);

    fclose(file);
    return 0;
}

2. ファイルシーク操作の実践

2.1 ファイルの中間位置への移動

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    fseek(file, 5, SEEK_SET); // ファイルの5バイト目に移動
    char buffer[50];
    if (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("Data from position 5: %s", buffer);
    }

    fclose(file);
    return 0;
}
動作解説
  1. ファイルのオープン:fopen()で読み取りモードでファイルを開きます。
  2. 特定位置への移動:fseek()で5バイト目に移動します。
  3. データの読み取り:fgets()を使ってデータを読み取ります。

2.2 ファイルの末尾に移動してデータを追加

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "a+");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    fseek(file, 0, SEEK_END); // ファイルの末尾に移動
    fprintf(file, "\nAppended data at the end."); // データを追加

    fclose(file);
    printf("Data appended successfully.\n");
    return 0;
}
動作解説
  1. ファイルのオープン:fopen()で追記モード"a+"でファイルを開きます。
  2. 末尾への移動:fseek()でファイルの末尾に移動します。
  3. データの追加:fprintf()を使ってデータを追記します。

3. 練習問題

以下の課題に挑戦して、ファイルシーク操作のスキルを向上させましょう。

  1. ファイルの先頭から10バイト目に移動して、その位置からデータを読み取るプログラムを作成してください。
  2. ファイルの末尾から10バイト目に移動して、その位置からデータを読み取るプログラムを作成してください。
  3. ファイルの特定の位置にデータを挿入するプログラムを作成してください。

4. 練習問題の解答と解説

問2の解答

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "r");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    fseek(file, -10, SEEK_END); // ファイルの末尾から10バイト前に移動
    char buffer[50];
    if (fgets(buffer, sizeof(buffer), file) != NULL) {
        printf("Data from 10 bytes before the end: %s", buffer);
    }

    fclose(file);
    return 0;
}

5. まとめ

ファイルシーク操作を習得することで、効率的なデータ操作が可能になります。次回は、シーク操作を活用した高度なファイル操作について学びます。