작성
·
221
0
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#define TSIZE 45
#define LMAX 10
struct movie {
char title[TSIZE];
float rating;
};
void read_file(struct movie movie_list[], int* ptr_n_items)
//값 바꿀수 잇어야 하므로 포인터로 저장
{
char filename[TSIZE] = { 0, };
//버퍼역할을 하는 문자의 배열
printf("읽기위한 파일 이름 입력후 엔터 눌르셈");
printf(">>");
if (scanf("%[^\n]%*c", filename) != 1) {
printf("Wrong input. Terminating\n");
exit(1);
}
FILE* file = fopen(filename, "r");
if (file == NULL)
{
printf("에러 : 파일 열 수 없음");
exit(1);
}
int num;
//파일 몇개인지 읽는 거
if (fscanf(file, "%d%*c", &num) != 1) {
printf("ERROR: 잘못된 파일 포맷");
exit(1);
}
for (int n = 0; n < num; ++n)
{
if (fscanf(file, "%[^\n]%*c", movie_list[*ptr_n_items].title) != 1 ||
fscanf(file, "%f%*c", &movie_list[*ptr_n_items].rating) != 1)
{
printf("ERROR 잘못된 파일 형식");
exit(1);
}
*ptr_n_items += 1;
}
assert(*ptr_n_items == num);
fclose(file);
printf("%d items have been read from the file\n", *ptr_n_items);
}
void write_file(struct movie movie_list[], int n_items)
{
char filename[TSIZE] = { 0, };
printf("파일 이름 입력하고 엔터 쳐주세요");
printf(">>");
if (scanf("%[^\n]%*c", filename) != 1) {
printf("Wrong input . Terminating\n");
exit(1);
}
FILE* file = fopen(filename, "w");
if (file == NULL)
{
printf("ERROR : 파일 못염\n");
exit(1);
}
fprintf(file, "%d\n", n_items);
for (int n = 0; n < n_items; ++n)
{
fprintf(file, "%s\n", movie_list[n].title);
fprintf(file, "%f\n", movie_list[n].rating);
}
fclose(file);
printf("%d items have been saved to the file\n", n_items);
}
int input_int()
//사용자로부터 정수 입력 받는 경우 많기떄문에(자주 사용해서 하나 만듬)
{
int input;
while (1)
{
printf(">>");
if (scanf("%d%*c", &input) == 1) return input;
else {
printf("숫자 입력후 엔터 눌러주세요\n");
while (getchar() != '\n') continue;
}
}
}
int input_menu()
{
while (1)
{
printf("\n 옵션 선택후 엔터 눌러주세요\n");
printf("1.print all items 2. print an item\n");
printf("3.Edit an item 4. add an item\n");
printf("5.insert an item 6.delete an item\n");
printf("7.delete all items 8.save file\n");
printf("9.search by name 10.quit\n");
int input = input_int();
if (input >= 1 && input <= 10) return input;
else
printf("%d is invalid. please try again\n", input);
}
}
void print_all(struct movie movie_list[], int n_items)
{
for (int n = 0; n_items; ++n)
printf("%d: \"%s\", %.1f\n", n, movie_list[n].title, movie_list[n].rating);
}
void print_an_item(struct movie movie_list[], int n_items)
{
printf("Input the index of item to print\n");
int index = input_int();
if (index < n_items)
printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
else
printf("invalid items\n");
}
void edit_an_item(struct movie movie_list[], int n_items)
{
printf(" 수정하기 위한 아이템의 인덱스를 입력하세요");
int index = input_int();
if (index < n_items)
{
printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
printf("새 타이틀 입력후 엔터 쳐주세요");
printf(">>");
int f = scanf("%[^\n]%*c", movie_list[index].title);
printf("새 평점 입력후 엔터 쳐주세요");
printf(">>");
f = scanf_s("%f%*c", &movie_list[index].rating);
printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
}
else
printf("invlaid items\n");
}
void add_an_item(struct movie movie_list[], int* ptr_n_items)//n_items is a pointer
{
if (*ptr_n_items == LMAX)
{
printf("NO more space\n");
return;
}
const int index = *ptr_n_items;
printf("타이틀 입력후 엔터\n");
printf(">>");
int f = scanf("%[^\n]%*c", movie_list[index].title);
printf("평점 입력후 엔터\n");
printf(">>");
f = scanf("%f%*c", &movie_list[index].rating);
printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
*ptr_n_items += 1;
}
void insert_an_item(struct movie movie_list[], int* ptr_n_items)
{
if (*ptr_n_items == LMAX)
{
printf("공간 없음");
return;
}
printf("아이템 인덱스 입력");
int index = input_int();
//memmove(&movie_list[index+1], &movie_list[index],
//sizeof(struct movie) * (*ptr_n_items -index));
/*for llop implemetation*/
for (int i = *ptr_n_items - 1; i >= index; i--)
{
strcpy(movie_list[i + 1].title, movie_list[i].title);
movie_list[i + 1].rating = movie_list[i].rating;
}
//뒤에서 부터 한칸씩 앞으로 떙기는 거
printf("타이틀을 입력후 엔터 쳐주세요");
printf(">>");
int f = scanf("%[^\n]%*c", movie_list[index].title);
printf("새 평점 입력후 엔터 쳐주세요");
printf(">>");
f = scanf("%f%*c", &movie_list[index].rating);
printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
*ptr_n_items += 1;
}
void delete_an_item(struct movie movie_list[], int* ptr_n_items)
{
printf("아이템 인덱스 입력");
int index = input_int();
//memmove(&movie_list[index+1], &movie_list[index],
//sizeof(struct movie) * (*ptr_n_items -index));
/*for llop implemetation*/
for (int i = index; i < *ptr_n_items; i++)
{
strcpy(movie_list[i].title, movie_list[i + 1].title);
movie_list[i].rating = movie_list[i + 1].rating;
}
*ptr_n_items -= 1;
}
void search_by_name(struct movie movie_list[], int n_items)
{
printf("찾으려는 타이틀 입력");
printf(">> ");
char title[TSIZE] = { 0, };
if (scanf("%[^\n]%*c", title) != 1)
{
printf("Wrong input\n");
return;
}
int index = 0;
for (; index < n_items; ++index)
{
if (strcmp(movie_list[index].title, title) == 0)
break;
}
if (index == n_items)
printf("영화를 찾을 수 없읍니다 :%s\n", title);
else
printf("%d: \"%s\", %.1f\n", index, movie_list[index].title, movie_list[index].rating);
}
int main()
{
struct movie movie_list[LMAX];
size_t n_items = 0;
read_file(movie_list, &n_items);
while (1)
{
printf("\n");
int s = input_menu();
switch (s)
{
case 1:
print_all(movie_list, n_items);
break;
case 2:
print_an_item(movie_list, n_items);
break;
case 3:
edit_an_item(movie_list, n_items);
break;
case 4:
add_an_item(movie_list, &n_items);
break;
case 5:
insert_an_item(movie_list, &n_items);
break;
case 6:
delete_an_item(movie_list, &n_items);
break;
case 7:
n_items = 0;
break;
//& 있는애 있고 없는 애 있는데(n_items에서) 아이템 하나 추가 도ㅟ니까 값이 변해야 되므로 주솔르 넘겨준느 거.
case 8:
write_file(movie_list, n_items);
break;
case 9:
search_by_name(movie_list, n_items);
break;
case 10:
printf("Good bye\n");
exit(0);
default:
printf("%d is not implemented.\n", s);
}
}
return 0;
}
소스는 이렇게 다 따라 쳤는데 1번 실행하면 저렇게 에러가 뜨고 글자가 다 깨진 상태로 나오더라구요.. 이유를 알 수 있을까요?