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


今回は、ゲームのセーブをイメージして構造体のデータを扱っていきます。

セーブデータはRPGのキャラクターデータとします。

プレイヤーは4人パーティーとして、4人分のデータを準備します。

プレイヤー1人分のデータは構造体で宣言します。

プレイヤー構造体
 メンバ変数
  名前       name char型配列
  ヒットポイント  hp  int型
  マジックポイント mp  int型

<sample program 112-01>

#include <stdio.h>

#define NAME_MAX 20

#define PARTY_MAX 4

typedef struct
{
    char name[NAME_MAX];
    int hp;
    int mp;
} Player;

int main(void)
{
    Player player[PARTY_MAX];

    return 0;
}

ここから4人分の名前を入力し、hpとmpは乱数で決めるように作っていきます。

<sample program 112-02>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NAME_MAX 20

#define PARTY_MAX 4

typedef struct
{
    char name[NAME_MAX];
    int hp;
    int mp;
} Player;

int main(void)
{
    Player player[PARTY_MAX];

    int i;

    srand((unsigned int)time(NULL));

    for (i = 0; i < PARTY_MAX; i++) {

        scanf("%s", player[i].name);

        player[i].hp = rand() % 101 + 100;

        player[i].mp = rand() % 51 + 50;
    }

    return 0;
}

hpについては100から200までの範囲、mpについては50から100までの範囲でランダムに決まります。


この構造体に入っているデータをファイルに書き込むことでセーブを行います。

追加すべきプログラムは↓の通りです。

ファイルポインタを用意する

ファイルを開く

エラーチェックを行う

4人分のデータを書き込む

ファイルを閉じる

「4人分のデータを書き込む」以外の箇所から作ってみましょう。

今回書き込むファイルの名前は「Save.txt」とします。


<sample program 112-03>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NAME_MAX 20

#define PARTY_MAX 4

typedef struct
{
    char name[NAME_MAX];
    int hp;
    int mp;
} Player;

int main(void)
{
    Player player[PARTY_MAX];

    int i;

    FILE* fp;

    srand((unsigned int)time(NULL));

    for (i = 0; i < PARTY_MAX; i++) {

        scanf("%s", player[i].name);

        player[i].hp = rand() % 101 + 100;

        player[i].mp = rand() % 51 + 50;
    }

    fp = fopen("Save.txt", "w");

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

    /* データを書き込む場所 */

    fclose(fp);

    return 0;
}

今回は「データを書き込む」ので、モードは「"w"」です。


後はデータを書き込んで確認するだけなのですが、データを書き込む際には「読み込む」ことを考慮して書き込まなければなりません。

前回、区切り文字について触れましたが、データとデータの間には「半角空白」や「改行」といった区切り文字が必要になります。

今回の区切り文字は改行にしてみます。


<sample program 112-04>

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NAME_MAX 20

#define PARTY_MAX 4

typedef struct
{
    char name[NAME_MAX];
    int hp;
    int mp;
} Player;

int main(void)
{
    Player player[PARTY_MAX];

    int i;

    FILE* fp;

    srand((unsigned int)time(NULL));

    for (i = 0; i < PARTY_MAX; i++) {

        scanf("%s", player[i].name);

        player[i].hp = rand() % 101 + 100;

        player[i].mp = rand() % 51 + 50;
    }

    fp = fopen("Save.txt", "w");

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

    for (i = 0; i < PARTY_MAX; i++) {
        fprintf(fp, "%s\n", player[i].name);
        fprintf(fp, "%d\n", player[i].hp);
        fprintf(fp, "%d\n", player[i].mp);
    }

    fclose(fp);

    return 0;
}

実行した後で、保存された「Save.txt」の中身を確認しましょう。

<実行結果>

player1
player2
player3
player4
続行するには何かキーを押してください・・・

<Save.txtの中身>

player1
173
57
player2
147
61
player3
184
71
player4
168
53

name、hp、mpの順に4人分のデータが改行区切りで保存されています。

ロードする際には、この順番で読み込むようにプログラムを組めば良いですね。


次へ

戻る

目次へ