Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어 파일 처리 함수 fread()와 fwrite() 완벽 정리

개요

C언어에서 파일에 데이터를 저장하고 다시 불러올 때 가장 많이 사용되는 함수가 바로 fread()fwrite()입니다. 이 두 함수는 구조체(structure) 단위로 데이터를 한 번에 읽고 쓸 수 있어, 학생 정보처럼 여러 필드를 가진 레코드를 효율적으로 처리할 수 있습니다.

이 글에서는 두 함수의 문법과 예제를 살펴보고, 실제로 5명(예제에서는 2명)의 학생 정보를 파일에 저장한 후 다시 읽어 화면에 출력하는 전체 프로그램을 소개합니다.


문제 정의

학생들의 세부 정보를 파일에 저장하고, fread()와 fwrite() 함수를 이용해 동일한 내용을 다시 출력하는 C 프로그램을 작성해 보겠습니다.

fread() 함수란?

fread() 함수는 한 번에 레코드 전체를 읽어 들이는 함수입니다. 파일 포인터가 가리키는 위치에서 지정한 크기만큼의 데이터를 구조체 변수에 그대로 복사합니다.

문법(Syntax)

fread(&구조체변수, sizeof(구조체변수), 레코드 개수, 파일포인터);

사용 예시

struct emp{
    int eno;
    char ename[30];
    float sal;
} e;
FILE *fp;
fread(&e, sizeof(e), 1, fp);

위 코드는 파일에서 직원(emp) 구조체 하나의 크기만큼 데이터를 읽어 변수 e에 저장합니다.

fwrite() 함수란?

fwrite() 함수는 한 번에 레코드 전체를 파일에 기록하는 함수입니다. 구조체 변수의 메모리 내용을 그대로 파일에 쓰기 때문에 빠르고 간편합니다.

문법(Syntax)

fwrite(&구조체변수, sizeof(구조체변수), 레코드 개수, 파일포인터);

사용 예시

struct emp{
    int eno;
    char ename[30];
    float sal;
} e;
FILE *fp;
fwrite(&e, sizeof(e), 1, fp);

전체 프로그램: 학생 정보 저장 및 출력

아래 프로그램은 학생 번호, 이름, 점수를 입력받아 파일에 저장(fwrite)한 후, 같은 파일을 다시 열어 정보를 읽어(fread) 화면에 출력합니다.

#include<stdio.h>

struct student{
    int sno;
    char sname[30];
    float marks;
    char temp;
};

main(){
    struct student s[60];
    int i;
    FILE *fp;

    /* 파일 쓰기 모드로 열기 */
    fp = fopen("student1.txt", "w");
    for(i = 0; i < 2; i++){
        printf("enter details of student %d\n", i + 1);
        printf("student number:");
        scanf("%d", &s[i].sno);
        scanf("%c", &s[i].temp);   /* 입력 버퍼의 개행 문자 제거 */
        printf("student name:");
        gets(s[i].sname);
        printf("student marks:");
        scanf("%f", &s[i].marks);
        fwrite(&s[i], sizeof(s[i]), 1, fp);   /* 레코드를 파일에 기록 */
    }
    fclose(fp);

    /* 파일 읽기 모드로 다시 열기 */
    fp = fopen("student1.txt", "r");
    for(i = 0; i < 2; i++){
        printf("details of student %d are\n", i + 1);
        fread(&s[i], sizeof(s[i]), 1, fp);   /* 레코드를 파일에서 읽기 */
        printf("student number = %d\n", s[i].sno);
        printf("student name = %s\n", s[i].sname);
        printf("marks = %f\n", s[i].marks);
    }
    fclose(fp);
    getch();
}

실행 결과(Output)

enter details of student 1
student number:1
student name:pinky
student marks:56
enter details of student 2
student number:2
student name:rosy
student marks:87
details of student 1 are
student number = 1
student name = pinky
marks = 56.000000
details of student 2 are
student number = 2
student name = rosy
marks = 87.000000

핵심 포인트 정리

  • fwrite(): 구조체 변수의 내용을 파일에 한 번에 기록합니다.
  • fread(): 파일에서 구조체 크기만큼 데이터를 한 번에 읽어 옵니다.
  • 두 함수 모두 레코드 개수 인자를 조절하면 여러 개의 구조체를 한 번에 처리할 수 있습니다.
  • 파일 작업이 끝나면 반드시 fclose()로 파일을 닫아야 데이터가 안전하게 저장됩니다.

참고로 위 예제에서 사용된 gets() 함수는 버퍼 오버플로우 위험 때문에 최신 C 표준(C11)에서 제거되었으므로, 실무에서는 fgets() 사용을 권장합니다.