C言語学習記録6 図書カードプログラム

#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 {
    // 改行文字がない場合は、bufのサイズを超えた場合のためエラー終了する
    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 {
    // 改行文字がない場合は、bufのサイズを超えた場合のためエラー終了する
    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;


}