★ファイル操作(テキストファイル7)★


複数のファイルを使ったプログラムを組むことがあります。

ゲームで考えた方が伝わりやすいと思いますので、例えば

 面クリア型のゲームで1面ごとのデータをファイルで管理する。

 ノベルゲームなどのシナリオをシーンに応じて複数のファイルで管理する。

などです。


取りあえず、例として3つのファイルを使ってみます。

「A.txt」「B.txt」「C.txt」という名前でデータは文字列を入れておきます。

※カレントフォルダに作成します。


プログラムとしては、メニューを表示し、入力した番号に応じてファイルを開いて中身を表示するように作ります。

<sample program 118-01>

#include <stdio.h>

#define SENTENCE_MAX 100

int main(void)
{
    char sentence[SENTENCE_MAX];

    FILE* fp;

    int fileNo;

    for (;;) {

        printf("メニュー ファイルを選んでください。\n");
        printf("ファイルA → 1\n");
        printf("ファイルB → 2\n");
        printf("ファイルC → 3\n");
        printf("終了    → 0\n");

        scanf("%d", &fileNo);

        if (fileNo == 0) {
            break;
        }

        switch (fileNo) {
            
        case 1:
            fp = fopen("A.txt", "r");
            break;

        case 2:
            fp = fopen("B.txt", "r");
            break;

        case 3:
            fp = fopen("C.txt", "r");
            break;

        default:
            fp = NULL;
            break;
        }

        if (fp == NULL) {
            printf("OPEN ERROR\n");
            return 1;
        }

        fgets(sentence, SENTENCE_MAX, fp);

        printf("%s\n", sentence);

        fclose(fp);
    }

    return 0;
}

<実行結果>

メニュー ファイルを選んでください。
ファイルA → 1
ファイルB → 2
ファイルC → 3
終了    → 0
1
ファイルAです。
メニュー ファイルを選んでください。
ファイルA → 1
ファイルB → 2
ファイルC → 3
終了    → 0
2
ファイルBです。
メニュー ファイルを選んでください。
ファイルA → 1
ファイルB → 2
ファイルC → 3
終了    → 0
0
続行するには何かキーを押してください・・・

無限ループを作り、何度でもメニューを選択出来るようにしてあります。

1〜3の入力で、A〜Cのファイルをオープンし、中身を表示します。

A〜Cのファイルを扱う際に異なる箇所は「ファイル名」のみです。

ファイルをオープンするところを変数fileNoの中身で分岐すれば対応出来ます。

0〜3以外の数値が入力された場合、ファイルポインタfpにNULLが入り、エラー終了します。


この方法を採用した場合、ファイル数が数個であれば何とかなりそうですが、数十個、数百個になった場合switch文が非常に長くなってしまいます。

というかコピペでも書きたくありません・・・


もっと楽に扱える方法を説明します。

まず、ファイル名を「A」「B」「C」から「File1」「File2」「File3」に変更します。


これで、

 「」が入力されたら「File1」を開く

 「」が入力されたら「File2」を開く

 「」が入力されたら「File3」を開く

ことにします。

入力する数値とファイル名についている数字が一致しています。

ただ、入力するのは「数値」でファイル名は文字列なので一工夫必要になります。

まず、ファイル名を格納するための文字列を用意します。

そこへ「sprintf」を使って数値からファイル名を作るのです。

<sample program 118-02>

#include <stdio.h>

#define SENTENCE_MAX 100

#define FILE_MAX 20

int main(void)
{
    char sentence[SENTENCE_MAX];

    char filename[FILE_MAX];

    FILE* fp;

    int fileNo;

    for (;;) {

        printf("メニュー ファイルを選んでください。\n");
        printf("ファイルA → 1\n");
        printf("ファイルB → 2\n");
        printf("ファイルC → 3\n");
        printf("終了    → 0\n");

        scanf("%d", &fileNo);

        if (fileNo == 0) {
            break;
        }

        sprintf(filename, "File%d.txt", fileNo);

        fp = fopen(filename, "r");
        
        if (fp == NULL) {
            printf("OPEN ERROR\n");
            return 1;
        }

        fgets(sentence, SENTENCE_MAX, fp);

        printf("%s\n", sentence);

        fclose(fp);
    }

    return 0;
}

<実行結果>

メニュー ファイルを選んでください。
ファイルA → 1
ファイルB → 2
ファイルC → 3
終了    → 0
1
ファイルAです。
メニュー ファイルを選んでください。
ファイルA → 1
ファイルB → 2
ファイルC → 3
終了    → 0
3
ファイルCです。
メニュー ファイルを選んでください。
ファイルA → 1
ファイルB → 2
ファイルC → 3
終了    → 0
0
続行するには何かキーを押してください・・・

この方法であれば、ファイルがいくら増えてもプログラムを変える必要はありません。

面クリア型のゲームであっても、面数とファイル名の番号が一致していれば、同じように開くことが出来ます。


次へ

戻る

目次へ