C언어에서는 fwrite()와 fread() 함수를 사용하여 구조체(structure) 같은 이진 데이터를 파일에 쓰거나 읽을 수 있습니다. 텍스트 형식이 아닌 메모리의 원본 데이터를 그대로 저장하므로, 대용량 데이터를 빠르게 처리할 때 특히 유용합니다.
fwrite() 함수 문법
fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
각 매개변수의 의미는 다음과 같습니다.
ptr - 파일에 기록할 요소들이 담긴 배열을 가리키는 포인터입니다.
size - 기록할 각 요소의 크기(바이트 단위)입니다.
nmemb - 기록할 요소의 개수입니다.
stream - 출력 스트림을 지정하는 FILE 객체에 대한 포인터입니다.
fread() 함수 문법
fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
각 매개변수의 의미는 다음과 같습니다.
ptr - 최소 size * nmemb 바이트 크기를 가지는 메모리 블록을 가리키는 포인터입니다.
size - 읽어들일 각 요소의 크기(바이트 단위)입니다.
nmemb - 읽어들일 요소의 개수입니다.
stream - 입력 스트림을 지정하는 FILE 객체에 대한 포인터입니다.
알고리즘
시작
Student라는 이름의 구조체를 만들어 변수를 선언한다.
파일을 쓰기 모드로 연다.
파일 열기 중 오류가 발생했는지 확인한다.
변수에 데이터를 초기화한다.
파일이 성공적으로 열렸다면 write 방식으로 구조체를 기록한다.
쓰기 작업이 끝나면 파일을 닫는다.
파일을 읽기 모드로 연다.
파일 열기 중 오류가 발생했는지 확인한다.
파일이 성공적으로 열렸다면 read 방식으로 파일을 읽는다.
읽기 작업이 끝나면 파일을 닫는다.
오류 발생 여부를 확인한다.
데이터를 출력한다.
끝.아래는 C언어에서 구조체를 파일에 쓰고 읽는 전체 예제 코드입니다.
예제 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student {
int roll_no;
char name[20];
};
int main () {
FILE *of;
of= fopen ("c1.txt", "w");
if (of == NULL) {
fprintf(stderr, "
Error to open the file
");
exit (1);
}
struct Student inp1 = {1, "Ram"};
struct Student inp2 = {2, "Shyam"};
fwrite (&inp1, sizeof(struct Student), 1, of);
fwrite (&inp2, sizeof(struct Student), 1, of);
if(fwrite != 0)
printf("Contents to file written successfully !
");
else
printf("Error writing file !
");
fclose (of);
FILE *inf;
struct Student inp;
inf = fopen ("c1.txt", "r");
if (inf == NULL) {
fprintf(stderr, "
Error to open the file
");
exit (1);
}
while(fread(&inp, sizeof(struct Student), 1, inf))
printf ("roll_no = %d name = %s
", inp.roll_no, inp.name);
fclose (inf);
}실행 결과
Contents to file written successfully ! roll_no = 1 name = Ram roll_no = 2 name = Shyam
코드 설명
위 예제는 두 단계로 동작합니다. 먼저 쓰기 단계에서는 fopen()으로 c1.txt 파일을 열고, 학생 정보를 담은 두 개의 구조체 변수 inp1과 inp2를 fwrite()로 파일에 기록합니다. 이때 sizeof(struct Student)를 사용해 구조체 하나의 크기를 자동으로 계산하므로 코드가 더 안전해집니다.
그다음 읽기 단계에서는 같은 파일을 다시 열고, fread()를 while 루프 안에서 호출하여 파일 끝까지 구조체 단위로 데이터를 반복해서 읽어 들입니다. fread()는 성공적으로 읽은 요소 수를 반환하므로, 반환값이 0이 되면 파일의 끝에 도달한 것으로 판단해 루프가 종료됩니다.