#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+" 読み込みと追加書き込み 最後に追加する 新規作成
*/
最終更新:2008年07月22日 20:05