개요
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() 사용을 권장합니다.