고흐의 연구실/C언어와 C++

[C언어] 파일관련(3) 파일구조체 fwrite(), fread()

전고흐 2020. 9. 30. 21:10
728x90
  • fwrite(버퍼, 쓰기크기, 쓰기횟수, 파일포인터);
    • size_t fwrite(void const *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
    • 성공한 쓰기 횟수를 반환, 실패하면 지정된 쓰기 횟수보다 작은 값을 반환

ㅇ Example

#define _CRT_SECURE_NO_WARNINGS    // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // fopen, fwrite, fclose 함수가 선언된 헤더 파일

#pragma pack(push, 1)    // 1바이트 크기로 정렬
struct Data {
    short num1;    // 2바이트
    short num2;    // 2바이트
    short num3;    // 2바이트
    short num4;    // 2바이트
};
#pragma pack(pop)       // 정렬 설정을 이전 상태(기본값)로 되돌림
 
int main()
{
    struct Data d1;

    d1.num1 = 100;
    d1.num2 = 200;
    d1.num3 = 300;
    d1.num4 = 400;

    FILE *fp = fopen("data.bin", "wb");   // 파일을 쓰기/바이너리 모드(wb)로 열기

    fwrite(&d1, sizeof(d1), 1, fp);       // 구조체의 내용을 파일에 저장

    fclose(fp);    // 파일 포인터 닫기

    return 0;
}

ㅇExample2

#define _CRT_SECURE_NO_WARNINGS    // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>     // fopen, fwrite, fclose 함수가 선언된 헤더 파일
#include <string.h>    // strcpy, memset 함수가 선언된 헤더 파일

#pragma pack(push, 1)    //  1바이트 크기로 정렬
struct Data {
    char c1;        //  1바이트
    short num1;     //  2바이트
    int num2;       //  4바이트
    char s1[20];    // 20바이트
};
#pragma pack(pop)       // 정렬 설정을 이전 상태(기본값)로 되돌림

int main()
{
    struct Data d1;
    memset(&d1, 0, sizeof(d1));    // 구조체 변수의 내용을 0으로 초기화

    d1.c1 = 'a';                       // 문자 저장
    d1.num1 = 32100;                   // 2바이트 크기의 숫자 저장
    d1.num2 = 2100000100;              // 4바이트 크기의 숫자 저장
    strcpy(d1.s1, "Hello, world!");    // 문자열 저장

    FILE *fp = fopen("data2.bin", "wb");   // 파일을 쓰기/바이너리 모드(wb)로 열기

    fwrite(&d1, sizeof(d1), 1, fp);        // 구조체의 내용을 파일에 저장

    fclose(fp);    // 파일 포인터 닫기

    return 0;
}

 

 

 

  • fread(버퍼, 읽기크기, 읽기횟수, 파일포인터);
    • size_t fread(void *_Buffer, size_t _ElementSize, size_t _ElementCount, FILE *_Stream);
    • 성공한 읽기 횟수를 반환, 실패하면 지정된 읽기 횟수보다 작은 값을 반환

ㅇExample

#define _CRT_SECURE_NO_WARNINGS    // fopen 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>>    // fopen, fread, fclose 함수가 선언된 헤더 파일

#pragma pack(push, 1)    // 1바이트 크기로 정렬
struct Data {
    char c1;        //  1바이트
    short num1;     //  2바이트
    int num2;       //  4바이트
    char s1[20];    // 20바이트
};
#pragma pack(pop)        // 정렬 설정을 이전 상태(기본값)로 되돌림

int main()
{
    struct Data d1;

    FILE *fp = fopen("data2.bin", "rb");   // 파일을 읽기/바이너리 모드(rb)로 열기

    fread(&d1, sizeof(d1), 1, fp);         // 파일의 내용을 읽어서 구조체 변수에 저장

    printf("%c %d %d %s\n", d1.c1, d1.num1, d1.num2, d1.s1);    // a 32100 2100000100 Hello, world!

    fclose(fp);    // 파일 포인터 닫기

    return 0;
}

 

 

출처: dojang.io/mod/quiz/review.php?attempt=1105879&cmid=630

728x90