教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kt

教えてください

#1

投稿記事 by kt » 9年前

コード:


#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);
}
バイナリデータの読み込み書き込みが分かりません
ソースを教えてくださいお願いします。


box
記事: 2002
登録日時: 14年前

Re: 教えてください

#3

投稿記事 by box » 9年前

kt さんが書きました:

コード:

void LoadData(PLAYER*player_data)
void SaveData(PLAYER*player_data)
この2つの関数、どこからも呼び出していないように見えます。
開発途中だからですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 教えてください

#4

投稿記事 by Dixq (管理人) » 9年前

最初にLoadDataを、
最後にSaveDataを呼び出すだけでは思った動作にならないのですか?

かずま

Re: 教えてください

#5

投稿記事 by かずま » 9年前

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] がないため、ほかのデータの領域をぶっ壊しておかしなことになるでしょう。

kt

Re: 教えてください

#6

投稿記事 by kt » 9年前

返信遅れましたすいません
1入力 データ入力
2入力 データ出力
3入力 バトル
4入力 データロード
5入力 セーブ
0入力 終了
みたいな感じでです。
期限が明日なので急いでいます
よろしくお願いします

閉鎖

“C言語何でも質問掲示板” へ戻る