#include<stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFSIZE 256
#define MAX 100
#define SIZE 80
char name[MAX][SIZE];
char book[MAX][SIZE];
char company[MAX][SIZE];
int idx = 0;
int menu(void);
int savefile(void);
int loadfile(void);
int input(char *msg, char *out);
int show_book(int num);
int main(void) {
int choice;
char word[SIZE];
int i;
loadfile();
while(1){
choice = menu();
switch (choice) {
case 1:
input("著者名を入力してください:", name[idx]);
input("書籍名を入力してください:", book[idx]);
input("出版社を入力してください:", company[idx]);
idx++;
break;
case 2:
input("検索する著者名を入力してください:", word);
for (i=0;i<idx;i++) {
if (!strcmp(word, name[i])) {
show_book(i);
}
}
break;
case 3:
input("検索する書籍名を入力してください:", word);
for (i=0;i<idx;i++) {
if (!strcmp(word, book[i])) {
show_book(i);
}
}
case 4:
savefile();
break;
case 5:
exit(0);
}
}
return 0;
}
int show_book(int num) {
printf("著者名: %s\n", name[num]);
printf("書籍名: %s\n", book[num]);
printf("出版社: %s\n", company[num]);
return 0;
}
int input(char *msg, char *out) {
char buf[SIZE];
printf(msg);
if (fgets(buf, sizeof(buf), stdin) == NULL) {
fprintf(stderr, "入力エラー\n");
exit(1);
}
if (strchr(buf, '\n') != NULL) {
buf[strlen(buf) - 1] = '\0';
} else {
fprintf(stderr, "一行に入力可能な最大文字数(%d文字)をオーバーしました\n", sizeof(buf) -1 );
exit(1);
}
strcpy(out, buf);
return 0;
}
int savefile(void) {
char file_name[] = "catalog";
FILE *fp;
if ((fp = fopen(file_name, "wb")) == NULL) {
perror(file_name);
exit(1);
}
if (fwrite(&idx, sizeof(idx), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fwrite(name, sizeof(name), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fwrite(book, sizeof(book), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fwrite(company, sizeof(company), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fclose(fp) == EOF) {
perror(file_name);
exit(1);
}
return 0;
}
int loadfile(void) {
char file_name[] = "catalog";
FILE *fp;
if ((fp = fopen(file_name, "rb")) == NULL) {
return 0;
}
if (fread(&idx, sizeof(idx), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fread(name, sizeof(name), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fread(book, sizeof(book), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fread(company, sizeof(company), 1, fp) != 1) {
perror(file_name);
exit(1);
}
if (fclose(fp) == EOF) {
perror(file_name);
exit(1);
}
return 0;
}
int menu(void) {
char buf[BUFSIZE];
int num;
printf("図書カードカタログ:\n");
printf(" 1.入力\n");
printf(" 2.著者名による検索\n");
printf(" 3.書名による検索\n");
printf(" 4.ファイルに保存\n");
printf(" 5.終了\n");
if (fgets(buf, sizeof(buf), stdin) == NULL) {
fprintf(stderr, "入力エラー\n");
exit(1);
}
if (strchr(buf, '\n') != NULL) {
buf[strlen(buf) - 1] = '\0';
} else {
fprintf(stderr, "一行に入力可能な最大文字数(%d文字)をオーバーしました\n", sizeof(buf) -1 );
exit(1);
}
num = atoi(buf);
if (( num < 1 ) || ( num > 5 )) {
fprintf(stderr, "1から5までの数字を入力してください\n");
exit(1);
}
return num;
}