몽상실현개발주의

[따배씨] 14.14 구조체 파일 입출력 연습문제 본문

Language/C

[따배씨] 14.14 구조체 파일 입출력 연습문제

migrationArc 2021. 7. 4. 16:36

[따배씨] 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

 

실리콘 밸리의 프로그래머 : 네이버 블로그

안녕하세요! 홍정모 블로그에 오신 것을 환영합니다. 주로 프로그래밍 관련 메모 용도로 사용합니다. 강의 수강하시는 분들은 홍정모 연구소 카페로 오세요.

blog.naver.com

http://www.inflearn.com/course/following-c

 

홍정모의 따라하며 배우는 C언어 - 인프런 | 강의

'따배씨++'의 성원에 힘입어 새롭게 개발된 C 언어로 시작하는 프로그래밍 입문 강의입니다. '따배씨'와 함께 프로그래밍 인생을 업그레이드 해보세요., 따라하며 배우는 C언어 '따배씨++'의 성원

www.inflearn.com

 

Comments