EX02解説

「EX02解説」の編集履歴(バックアップ)一覧はこちら

EX02解説」(2008/07/22 (火) 20:05:37) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

#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 もご覧ください。