EX02解説


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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

#define CHARA_MAX 100
#define STR_LEN_MAX 100
#define FILE_NAME "data.dat"

typedef struct _tagCharaData{
	char charaname[STR_LEN_MAX];
	char charajob[STR_LEN_MAX];
	int hp;
	int mp;
} CharaData;
 
typedef enum _tag_menu_id{
	ID_ADD_CHARA,
	ID_DEL_CHARA,
	ID_DISPLAY_CHARA
}Menu_ID;
 
int yes_or_no();
Menu_ID menu();
void load_data(FILE*, CharaData*, int*);
void save_data(FILE*, CharaData*, int*);
void display_member(CharaData*, int*);
 
void main(){
 
	FILE *fp;
	CharaData data[CHARA_MAX];
	Menu_ID id;
	char name[STR_LEN_MAX], job[STR_LEN_MAX];
	int data_iter = 0, hp, mp;
 
 
	printf("いらっしゃい、ここはノレイーダの酒場よ。\n");
	printf("前回のデータをロードする?\n");
	if(!yes_or_no()){
		load_data(fp, data, &data_iter);	
		display_member(data, &data_iter);
	}
	printf("さあ、今日はどういったご用事?\n");
 
	while(1){      
		id = menu();
		switch(id){
			case ID_ADD_CHARA:
				printf("登録する冒険者の名前を書いてね : ");
				scanf("%s", &data[data_iter].charaname);
				printf("登録する冒険者の職業を書いてね : ");
				scanf("%s", &data[data_iter].charajob);
				printf("登録する冒険者のHPを書いてね   : ");
				scanf("%d", &data[data_iter].hp);
				printf("登録する冒険者のMPを書いてね   : ");
				scanf("%d", &data[data_iter].mp);
				printf("%s %s %d %d\n",&data[data_iter].charaname, &data[data_iter].charajob,
										data[data_iter].hp, data[data_iter].mp);
				printf("この人を登録しました\n");
				data_iter++;
				break;
			case ID_DEL_CHARA:
				break;
			case ID_DISPLAY_CHARA:
				display_member(data, &data_iter);
			default:
				break;
		}
 
		printf("他に用事はあるの?\n");
		if(yes_or_no())
			break;
		else
			printf("どうするの?\n");
	}
 
	printf("これまでのデータをセーブする?");
	if(!yes_or_no())
		save_data(fp,data,&data_iter);
	printf("ありがとう、また来てね!");
 
	return;
}
 
 
int yes_or_no(){
	int id;
 
	printf("はい(0) いいえ(1)\n");
	while(1){
		scanf("%d", &id);
 
		if(id == 0)
			return 0;
		else if(id == 1)
			return 1;
		else
			printf("0か1を入力してね\n");
	}
    return 0;
}
 
Menu_ID menu(){
	int input;
 
	while(1){
		printf("冒険者を登録する(1),冒険者を消す(2),登録している冒険者を見る(3)\n");
		scanf("%d", &input);
		switch(input){
			case 1: return ID_ADD_CHARA;
			case 2: return ID_DEL_CHARA;
			case 3: return ID_DISPLAY_CHARA;
			default:
				printf("1~3を入力してください\n");
		}
	}
}
 
void load_data(FILE* fp, CharaData* data, int* iter){
	char name[STR_LEN_MAX], job[STR_LEN_MAX];
	int hp, mp;
 
	if((fp = fopen(FILE_NAME, "r"))== NULL){
		printf("ファイルの読み込みに失敗したわ・・・\n");
		return;
	}
	while(fscanf(fp, "%s %s %d %d", &name, &job, &hp, &mp) != EOF){
		strcpy(data[*iter].charaname, name);
		strcpy(data[*iter].charajob, job);
		data[*iter].hp = hp;
		data[*iter].mp = mp;
        (*iter)++;
		if(*iter >= CHARA_MAX){
			printf("登録限界を超えたので読み込みを中止するわね\n");
			return;
		}
	}
	fclose(fp);
	printf("データのロードを完了したわ");
	return;
}
void save_data(FILE* fp, CharaData* data, int* iter){
	char name[STR_LEN_MAX], job[STR_LEN_MAX];
	int hp, mp, i = 0;
 
	if((fp = fopen(FILE_NAME, "w")) == NULL){
		printf("ファイルの作成に失敗したわ・・・\n");
		return;
	}
	for(i = 0; i < *iter; i++){
		strcpy(name, data[i].charaname);
		strcpy(job, data[i].charajob);
		hp   = data[i].hp;
		mp   = data[i].mp;
		fprintf(fp,"%s %s %d %d\n", name, job, hp, mp);
	}
 
	fclose(fp);
    printf("データのセーブを完了したわ。");
 
	return;
}
 
void display_member(CharaData* data, int* iter){
	int i;
	printf("えーと、登録されてるのは・・・\n");
	if(*iter == 0){
		printf("あら、誰も登録されてないじゃない。\n");
		return;
	}
	for(i = 0; i < *iter; i++){
		printf("%s %s %d %d\n",&data[i].charaname, &data[i].charajob,
										data[i].hp, data[i].mp);
	}
	printf("この%d人ね\n",*iter);
 
 
	return;
}
/*
モード	動作	ファイルがあるとき	ファイルがないとき
"r"	読み出し専用	正常	エラー(NULL返却)
"w"	書き込み専用	サイズを 0 にする(上書き)	新規作成
"a"	追加書き込み専用	最後に追加する	新規作成
"r+"	読み込みと書き込み	正常	エラー(NULL返却)
"w+"	書き込みと読み込み	サイズを 0 にする(上書き)	新規作成
"a+"	読み込みと追加書き込み	最後に追加する	新規作成
*/
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。