#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define FILENAME_PLAYERDATASAVE "save.txt"
#define FILENAME_PLAYERDATALOAD "load.txt"
#define PLAYER_MAX (2)
typedef struct
{
char name[21];
int hp;
int attack;
}PLAYER;
void input_player(PLAYER *);
void output_player(PLAYER *);
bool battle(PLAYER*, PLAYER*);
void SaveData(PLAYER*);
void LoadData(PLAYER*);
int main(void)
{
PLAYER player_data[PLAYER_MAX];
PLAYER *pt_player_data;
int i;
int b_end;
int turn;
pt_player_data = &player_data[0];
for (i = 0; i < PLAYER_MAX; i++)
{
input_player(pt_player_data);
pt_player_data++;
}
pt_player_data = &player_data[0];
for (i = 0; i < PLAYER_MAX; i++)
{
output_player(pt_player_data);
pt_player_data++;
}
turn = 0;
do{
b_end = battle(&player_data[turn], &player_data[(turn ^ 1)]);
turn = (turn ^ 1);
} while (!b_end);
getchar();
return 0;
}
void input_player(PLAYER*pt_data)
{
scanf("%s", pt_data->name);
rewind(stdin);
scanf("%d", &pt_data->hp);
rewind(stdin);
scanf("%d", &pt_data->attack);
rewind(stdin);
}
void output_player(PLAYER *pt_data)
{
printf("%s\n", pt_data->name);
printf("%d\n", pt_data->hp);
printf("%d\n", pt_data->attack);
}
bool battle(PLAYER *pt_atc, PLAYER *pt_def)
{
pt_def->hp -= pt_atc->attack;
if (pt_def->hp < 0)
pt_def = 0;
if (pt_def <= 0){
printf("%sの勝利\n", pt_atc->name);
return true;
}
return false;
}
void LoadData(PLAYER*player_data)
{
FILE *fp;
fp = fopen(FILENAME_PLAYERDATALOAD, "rb");
if (fp == NULL)
{
printf("ファイルオープンエラー");
exit(-1);
}
for (int i = 0; i < PLAYER_MAX; i++)
{
fread(player_data, sizeof(PLAYER), PLAYER_MAX, fp);
player_data++;
}
fclose(fp);
}
void SaveData(PLAYER*player_data)
{
FILE *fp;
fp = fopen(FILENAME_PLAYERDATASAVE, "wb");
if (fp == NULL)
{
printf("ファイルオープンエラー");
exit(-1);
}
for (int i = 0; i < PLAYER_MAX; i++)
{
fwrite(player_data, sizeof(PLAYER), PLAYER_MAX, fp);
player_data++;
}
fclose(fp);
}
バイナリデータの読み込み書き込みが分かりません
ソースを教えてくださいお願いします。
教えてください
教えてください
- Dixq (管理人)
- 管理人
- 記事: 1662
- 登録日時: 14年前
- 住所: 北海道札幌市
- 連絡を取る:
Re: 教えてください
最初にLoadDataを、
最後にSaveDataを呼び出すだけでは思った動作にならないのですか?
最後にSaveDataを呼び出すだけでは思った動作にならないのですか?
Re: 教えてください
ならないでしょう。Dixq (管理人) さんが書きました:最初にLoadDataを、
最後にSaveDataを呼び出すだけでは思った動作にならないのですか?
最初はセーブしたデータがないから、ロードに失敗して終了。
ロードできない場合は、デフォルトの初期値を用意するべきでしょう。
最後に SaveData を呼び出すと、for ループの 1回目の fwrite で
player_data[0] と player_data[1] の値を出力した後、ループの 2回目で
player_data[1] と player_data[2] の値を出力しようとします。
player_data[2] は存在しないので、ファイルには [0] [1] [1] [ゴミ] が書かれるでしょう。
次のゲーム開始では、最初に LoadData が呼ばれ、for ループの 1回目の fread で
player_data[0] と player_data[1] にデータが読み込まれますが、ループの 2回目で
player_data[1] と player_data[2] にデータを読み込もうとして、
player_data[2] がないため、ほかのデータの領域をぶっ壊しておかしなことになるでしょう。
Re: 教えてください
返信遅れましたすいません
1入力 データ入力
2入力 データ出力
3入力 バトル
4入力 データロード
5入力 セーブ
0入力 終了
みたいな感じでです。
期限が明日なので急いでいます
よろしくお願いします
1入力 データ入力
2入力 データ出力
3入力 バトル
4入力 データロード
5入力 セーブ
0入力 終了
みたいな感じでです。
期限が明日なので急いでいます
よろしくお願いします