/* * mem-rw.c * 第1引数が "save" ならデータファイルの作成、 * それ以外ならロード */ #include #include #include #define DATAFILE "memslot.bin" #define BUFSZ 20 typedef struct { char name[20]; /* 最大20バイトで足りるかな */ int shusseki; /* 出席番号は int */ int mathpt; /* 数学の得点も int */ int engpt; /* 英語の得点も int */ } TOKUTEN; /* セミコロンが必要!! */ /* * TOKUTEN* のデータを出力する。 */ void dispdata(TOKUTEN *d) { printf("%10.10s の得点 |\n", d->name); printf("%17.17s | %3d\n", "数学", d->mathpt); printf("%17.17s | %3d\n", "英語", d->engpt); } /* * TOKUTEN* のデータを所定のデータファイルにバイナリのまま書き込む */ int save(TOKUTEN *t) { char tmp[sizeof(t->name)+1]; FILE *fp; while (t->name[0] == '\0') { /* データの入力と構造体への代入 */ fputs("名前: ", stderr); fgets(tmp, sizeof tmp, stdin); sscanf(tmp, "%s", t->name); fputs("出席番号: ", stderr); fgets(tmp, sizeof tmp, stdin); t->shusseki = atoi(tmp); fputs("数学得点: ", stderr); fgets(tmp, sizeof tmp, stdin); t->mathpt = atoi(tmp); fputs("英語得点: ", stderr); fgets(tmp, sizeof tmp, stdin); t->engpt = atoi(tmp); } if (NULL != (fp=fopen(DATAFILE, "w"))) { /* ここで実際にファイルに書き込んでいる */ fwrite(t, sizeof *t, 1, fp); fclose(fp); puts("これから保存するデータ:"); dispdata(t); return 0; } return 1; } /* * 所定のデータファイルのバイナリデータを TOKUTEN* に読み込む */ int load(TOKUTEN *t) { FILE *rfp; int sz = sizeof *t; int rc=1; if (NULL != (rfp=fopen(DATAFILE, "r"))) { /* freadでバイナリデータを読む */ if (1 == fread(t, sz, 1, rfp)) { printf("%sからロードしたデータ:\n", DATAFILE); dispdata(t); rc = 0; } else { fputs("読み込み失敗\n", stderr); } } fclose(rfp); return rc; } int main(int argc, char *argv[]) { int rc; TOKUTEN data; memset(&data, 0, sizeof data); if (argc > 1 && 0 == strcmp(argv[1], "save")) rc = save(&data); else rc = load(&data); return rc; }