C言語

【C言語】第7章第4回:ファイルポインタの基本と活用

ファイルポインタは、ファイル操作の中心的な役割を果たします。本記事では、ファイルポインタの基本的な使い方と応用例を学びます。

0. 記事の概要

この記事を読むメリット

  • ファイル操作の基礎を理解:ファイルポインタの仕組みを学べます。
  • 実践力の向上:応用的なファイル操作を実現できるスキルを習得できます。
  • エラー処理の理解:ファイル操作中のエラーを適切に処理する方法を学べます。

この記事で学べること

  • ファイルポインタの基本概念
  • ファイルポインタを使用したファイル操作
  • エラー処理の基本

活用のイメージ

例えば、ファイルポインタを使用してログデータを記録したり、大量のデータを効率的に操作したりすることが可能です。本記事では、その基本を詳しく解説します。

1. ファイルポインタの基本

1.1 ファイルポインタとは?

ファイルポインタは、FILE型のポインタで、ファイル操作を行う際に使用されます。

#include <stdio.h>

int main() {
    FILE *file; // ファイルポインタを宣言
    file = fopen("example.txt", "r"); // ファイルを開く
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    // ファイル操作を行うコード

    fclose(file); // ファイルを閉じる
    return 0;
}
動作解説
  1. ファイルポインタの宣言:FILE型のポインタを宣言します。
  2. ファイルを開く:fopen()関数を使用し、ファイルを開きます。
  3. エラー処理:ファイルが正常に開けなかった場合、NULLを返します。
  4. ファイルを閉じる:fclose()関数でファイルを閉じます。

1.2 ファイルポインタの役割

ファイルポインタは、以下のような操作を管理します。

  • ファイルの現在の位置
  • ファイルモード(読み取り、書き込み、追記など)
  • ファイル操作の状態(エラーやEOF)

1.3 ファイルポインタの基本操作

ファイルポインタを使用する基本操作を以下に示します。

#include <stdio.h>

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

    fprintf(file, "Hello, World!\n"); // ファイルにデータを書き込む
    fclose(file); // ファイルを閉じる

    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("Error opening file.\n");
        return 1;
    }

    char buffer[50];
    fgets(buffer, sizeof(buffer), file); // ファイルからデータを読み取る
    printf("Read from file: %s", buffer);
    fclose(file);

    return 0;
}
動作解説
  1. ファイルを開く:fopen()で書き込みモード"w"でファイルを開きます。
  2. データの書き込み:fprintf()を使用してファイルにデータを書き込みます。
  3. ファイルを閉じる:fclose()でファイルを閉じます。
  4. ファイルを再度開く:fopen()で読み取りモード"r"でファイルを開きます。
  5. データの読み取り:fgets()を使用してデータを読み取ります。
  6. データの出力:読み取ったデータをコンソールに出力します。

2. ファイルポインタを活用した応用例

2.1 ファイルの内容をコピーするプログラム

#include <stdio.h>

int main() {
    FILE *source = fopen("source.txt", "r");
    FILE *destination = fopen("destination.txt", "w");

    if (source == NULL || destination == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    char ch;
    while ((ch = fgetc(source)) != EOF) { // 1文字ずつ読み取る
        fputc(ch, destination); // 1文字ずつ書き込む
    }

    fclose(source);
    fclose(destination);
    printf("File copied successfully.\n");
    return 0;
}
動作解説
  1. 2つのファイルを開く:ソースファイルを読み取りモード、宛先ファイルを書き込みモードで開きます。
  2. データをコピー:fgetc()で1文字ずつ読み取り、fputc()で1文字ずつ書き込みます。
  3. ファイルを閉じる:両方のファイルをfclose()で閉じます。

2.2 ファイルの行数をカウントするプログラム

#include <stdio.h>

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

    char ch;
    int lines = 0;

    while ((ch = fgetc(file)) != EOF) {
        if (ch == '\n') {
            lines++;
        }
    }

    fclose(file);
    printf("Total lines: %d\n", lines);
    return 0;
}
動作解説
  1. ファイルを開く:読み取りモードでファイルを開きます。
  2. データを走査:fgetc()で1文字ずつ読み取り、改行文字をカウントします。
  3. 行数を出力:改行数をコンソールに表示します。

3. 練習問題

以下の課題に挑戦して、ファイルポインタの活用スキルを磨きましょう。

  1. ファイルを開き、すべての文字を大文字に変換して別のファイルに保存するプログラムを作成してください。
  2. 指定したファイルの単語数をカウントするプログラムを作成してください。
  3. 複数のファイルを1つのファイルに結合するプログラムを作成してください。

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

問1の解答

#include <stdio.h>
#include <ctype.h>

int main() {
    FILE *source = fopen("source.txt", "r");
    FILE *destination = fopen("uppercase.txt", "w");

    if (source == NULL || destination == NULL) {
        printf("Error opening files.\n");
        return 1;
    }

    char ch;
    while ((ch = fgetc(source)) != EOF) {
        fputc(toupper(ch), destination); // 大文字に変換して書き込む
    }

    fclose(source);
    fclose(destination);
    printf("File converted to uppercase successfully.\n");
    return 0;
}

5. まとめ

ファイルポインタは、C言語のファイル操作における基本であり、応用的な処理を実現するための重要なツールです。次回は、ファイル操作を最適化するテクニックについて学びます。