質問: 2){ printf("ファイル名を指定してください: "); scanf("%s",&file); if(num==1) save(file); if(num==2) load(file); }else printf("入力された数値が正しくありません。\n"); }while(num != 0) return 0; }
回答: テキストで保存する方法を考えたけど、あまり良くない。(スペースが含まれてるとfscanfはそこで区切ってしまい、以降は正常に読めなくなる) これを防ぐにはそれなりの処理を考える必要があるけど、面倒ならバイナリで構造体ごと保存・読み込みをした方が楽。 それにしても、元のソースは誤りが多い。 main関数内をどう直したかぐらいはチェックしてほしい。 #include struct date {/*作成日付を格納*/ int year;/*年*/ int month;/*月*/ int day;/*日*/ }; struct record {/*レコード*/ char title[30];/*タイトル名*/ char stitle[50];/*副タイトル名*/ struct date adate;/*作成日付*/ char path[50];/*パス名(ファイルがどこのフォルダにあるか)*/ char category[30];/*分類*/ }; int save(struct record data, const char *fname)/*ファイルを保存する*/ { file *fp; fp = fopen(fname,"w"); if (fp == null){ fprintf(stderr,"cannot open file: %s\n", fname); return -1; } fprintf(fp, "title=%s\n", data.title); fprintf(fp, "stitle=%s\n", data.stitle); fprintf(fp, "date=%04d-%02d-%02d\n", data.adate.year, data.adate.month, data.adate.day); fprintf(fp, "path=%s\n", data.path); fprintf(fp, "category=%s\n", data.category); fclose(fp); return(0); } int load(struct record *pdata, const char *fname)/*ファイルを読み込む*/ { file *fp; fp = fopen(fname,"r"); if (fp == null){ fprintf(stderr,"cannot open file: %s\n", fname); return -1; } fscanf(fp, "title=%s\n", pdata->title); fscanf(fp, "stitle=%s\n", pdata->stitle); fscanf(fp, "date=%04d-%02d-%02d\n", &(pdata->adate.year), &(pdata->adate.month), &(pdata->adate.day)); fscanf(fp, "path=%s\n", pdata->path); fscanf(fp, "category=%s\n", pdata->category); fclose(fp); return(0); } int main(void) { int num; char file[256]; int sortnum; struct record recdata; printf("プログラムファイル管理プログラムへようこそ!\n"); do{ printf("何をしますか?\n"); printf("[0:終了、1:保存、2:読み込み]\n"); printf("入力してください: "); scanf("%d",#); if(num==1 || num == 2){ printf("ファイル名を指定してください: "); scanf("%s",&file); if(num==1) save(recdata, (const char *)file); if(num==2) load(&recdata, (const char *)file); }else if (num != 0) { printf("入力された数値が正しくありません。\n"); } }while(num != 0); return 0; }