Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- sorting
- Math
- Algospot
- 생활코딩
- php
- greedy
- C
- udemy
- JavaScript
- 따라하면서 배우는 C언어
- programmers
- 따배씨
- Python
- BFS
- C언어
- 따라하며 배우는 C언어
- 인프런
- BASIC
- server
- Cleancode
- 종만북
- Algorithm
- dfs
- BOJ
- DP
- 정수론
- web
- 백준
- String
- graph
Archives
- Today
- Total
몽상실현개발주의
[따배씨] 14.14 구조체 파일 입출력 연습문제 본문
따배씨 - 따라하며 배우는 C언어
14강 구조체_2
14.14 구조체 파일 입출력 연습문제
#include <stdio.h>
#include <stdlib.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);
struct book* read_books(const char* filename, 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");
exit(1);
}
my_books[0] = (struct book){"The Grat 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.txt", my_books, n);
free(my_books);
my_books = NULL;
n = 0;
printf("Done.\n");
printf("\nPress any key to read data from a file.\n\n");
temp = getchar();
// my_books = read_books("books.txt", &n);
read_books2("books.txt", &my_books, &n);
print_books(my_books, n);
free(my_books);
my_books = NULL;
n = 0;
return 0;
}
void print_books(const struct book * books, int n)
{
for (int i = 0; i < n; ++i)
printf("Book %d : \"%s\" wrriten by \"%s\"\n", i, books[i].name, books[i].author);
}
void write_books(const char * filename, const struct book* books, int n)
{
FILE* file = fopen(filename, "w");
if (file == NULL)
{
fputs("Can't open file", stderr);
exit(1);
}
fprintf(file, "%d\n", n); // number of books
for (int i = 0; i < n; ++i)
{
fprintf(file, "%s\n%s\n", books[i].name, books[i].author);
}
fclose(file);
}
struct book* read_books(const char* filename, int* n_ptr)
{
FILE* file = fopen(filename, "r");
if(file==NULL)
{
fputs("Can't open file", stderr);
exit(1);
}
int flag;
flag = fscanf(file, "%d%*c", n_ptr); // Remove last '\n'
if (flag != 1)
{
printf("File read failed");
exit(1);
}
struct book* books = (struct book*)calloc(sizeof(struct book), *n_ptr);
if (!books)
{
printf("Malloc() Fail.");
exit(1);
}
for (int i = 0; i < *n_ptr; ++i)
{
flag = fscanf(file, "%[^\n]%*c%[^\n]%*c", books[i].name, books[i].author);
if (flag != 2)
{
printf("File read failed");
exit(1);
}
}
return books;
};
void read_books2(const char* filename,struct book **books_dptr, int* n_ptr)
{
FILE* file = fopen(filename, "r");
if (file==NULL)
{
fputs("Can't open file", stderr);
exit(1);
}
int flag;
flag = fscanf(file, "%d%*c", n_ptr); // Remove last '\n'
if (flag != 1)
{
printf("File read failed");
exit(1);
}
struct book* books = (struct book*)calloc(sizeof(struct book), *n_ptr);
if(!books)
{
printf("Malloc() failed.");
exit(1);
}
for (int i = 0; i < *n_ptr; ++i)
{
flag = fscanf(file, "%[^\n]%*c%[^\n]%*c", books[i].name, books[i].author);
if (flag != 2)
{
printf("File read failed");
exit(1);
}
}
fclose(file);
*books_dptr = books;
}
// binary format 으로 처리
void write_books(const char * filename, const struct book* books, int n)
{
FILE* file = fopen(filename, "wb");
if (file == NULL)
{
fputs("Can't open file", stderr);
exit(1);
}
fwrite(&n, sizeof(n), 1, file); // number of books
fwrite(books, sizeof(struct book), n, file);
fclose(file);
}
void read_books2(const char* filename,struct book **books_dptr, int* n_ptr)
{
FILE* file = fopen(filename, "r");
if (file==NULL)
{
fputs("Can't open file", stderr);
exit(1);
}
fread(n_ptr, sizeof(*n_ptr), 1, file);
struct book* books = (struct book*)calloc(sizeof(struct book), *n_ptr);
if(!books)
{
printf("Malloc() failed.");
exit(1);
}
fread(books, sizeof(struct book), *n_ptr, file);
fclose(file);
*books_dptr = books;
}
- 데이터 양이 많고 속도가 중요할 경우 binary format이 유리함
이 글의 모든 사진과 내용의 출처는 홍정모 교수님께 있음을 알려드립니다.
http://blog.naver.com/atelierjpro
http://www.inflearn.com/course/following-c
'Language > C' 카테고리의 다른 글
[따배씨] 14.16 공용체와 구조체를 함께 사용하기 (0) | 2021.07.05 |
---|---|
[따배씨] 14.15 공용체 Union 의 원리 (0) | 2021.07.05 |
[따배씨] 14.13 구조체의 배열을 사용하는 함수 (0) | 2021.07.04 |
[따배씨] 14.12 익명 구조체 (0) | 2021.06.28 |
[따배씨] 14.11 신축성 있는 배열 멤버 (0) | 2021.06.28 |
Comments