해결된 질문
작성
·
342
0
안녕하세요. 프로그램 실행중에 무언가 오류가 생겨 질문 드립니다.
강사님께서 이번강의 후반부에 보여주신 제 컴퓨터에 작성하여 실행해보았습니다. 그런대 이게 컴퓨터 자체의 문제인지 코드 문제인지 도통 이해할수 없는 오류가 발생했습니다.
void write_books(const char* filename, const struct book* books, int n)
{
FILE* fp = fopen(filename, "wb");
if (fp == NULL)
{
printf("Can't open file\n");
exit(1);
}
fwrite(&n, sizeof(n), 1, fp);
fwrite(books, sizeof(struct book), n, fp);
fclose(fp);
}
void read_books2(const char* filename, struct book** books_dptr, int* n)
{
FILE* fp = fopen(filename, "rb");
if (fp == NULL)
{
printf("Can't open file\n");
exit(1);
}
fread(n, sizeof(int), 1, fp);
struct book* read_books = (struct book*)calloc(sizeof(struct book), *n);
fread(read_books, sizeof(struct book), *n, fp);
fclose(fp);
*books_dptr = read_books;
}
나머지 코드는 강의 내용과 같습니다. 그런데 이 코드를 실행해보면
이렇게 "The Great Gatsby"가 출력되지 않습니다. 가끔씩은 빈칸이 아니라 쓰레기값으로 추정되는 이상한 값이 출력되기도 했습니다. 디버그를 실행해보니
분명 read_books에 잘 들어간 "The Great Gatsby"가
*books_dptr에 read_books를 대입하니 왠 설명만 있고 없어져 있습니다.
이것이 도대체 무슨 현상인지 알수가 없습니다. 답변 부탁드립니다.
답변 2
1
안녕하세요!
질문자님께서 주신 전체 코드 그대로 복사해서 실행해보았는데 저는 질문자님께서 말씀하신 현상이 재현이 되지 않습니다. 개츠비 잘 읽어왔고 전체적으로 다 정상적으로 잘 출력이 됩니다.
그래서 원인 파악이 되지 않네요.. 해당 파일 삭제하고 다시 새롭게 실행해보셔도 그런가요?
0
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define SLEN 101
struct book
{
char name[SLEN];
char author[SLEN];
};
void print_books(const struct book books[], int n);
void write_books(const char* filename, const struct book* books, int n);
void read_books2(const char* filename, struct book** books_dptr, int* n);
int main()
{
int temp;
int n = 3;
struct book* my_books = (struct book*)malloc(sizeof(struct book) * n);
if (!my_books)
{
printf("Malloc failed\n");
exit(1);
}
my_books[0] = (struct book){ "The Great Gatsby","F. Scott Fitzgerald" };
my_books[1] = (struct book){ "Hamlet","William Shakespeare" };
my_books[2] = (struct book){ "The Odyssey","Homer" };
print_books(my_books, n);
printf("\nWriting to a file.\n");
write_books("books.dat", my_books, n);
free(my_books);
n = 0;
printf("Done.\n");
printf("\nPress any key to read data from a file.\n\n");
temp = _getch();
read_books2("books.dat", &my_books, &n);
print_books(my_books, n);
free(my_books);
n = 0;
return 0;
}
void print_books(const struct book books[], int n)
{
for (int i = 0; i < n; ++i)
printf("Book %d : \"%s\" written by \"%s\"\n", i + 1, books[i].name, books[i].author);
}
void write_books(const char* filename, const struct book* books, int n)
{
FILE* fp = fopen(filename, "wb");
if (fp == NULL)
{
printf("Can't open file\n");
exit(1);
}
fwrite(&n, sizeof(n), 1, fp);
fwrite(books, sizeof(struct book), n, fp);
fclose(fp);
}
void read_books2(const char* filename, struct book** books_dptr, int* n)
{
FILE* fp = fopen(filename, "rb");
if (fp == NULL)
{
printf("Can't open file\n");
exit(1);
}
fread(n, sizeof(*n), 1, fp);
struct book* read_books = (struct book*)malloc(sizeof(struct book) * *n);
fread(read_books, sizeof(struct book), *n, fp);
fclose(fp);
*books_dptr = read_books;
}
예, 여기있습니다.
기존 코드를 전부 지우고 복사해서 다시 실행하니 저도 잘 작동됬습니다. 아무래도 컴퓨터가 오래되었다보니 좀 오류가 있었던것 같습니다. 감사합니다.