C 언어 fread 함수 완전 해설

1. fread() 개요

fread()는, C 언어에서 바이너리 데이터를 스트림으로부터 프로그램에 읽어들이는 함수입니다. 이 함수는 파일의 내용을 효율적으로 버퍼에 읽어들일 때 사용됩니다. 특히 대규모 데이터의 읽기나 이미지·음성 등 바이너리 파일의 조작에 적합합니다.

1.1. fread() 기본 사용법

fread()의 기본 구문은 다음과 같습니다:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr: 읽어들인 데이터를 저장하는 버퍼 포인터
  • size: 읽어들일 데이터의 한 요소의 크기(바이트 단위)
  • nmemb: 읽어들일 요소의 수
  • stream: 읽어들일 스트림 포인터

2. fread()의 동작과 반환값

2.1. fread()의 동작

fread()는 지정된 스트림에서 지정된 바이트 수를 읽어 ptr로 지정된 버퍼에 저장합니다. 이 함수는 nmemb개의 데이터를 읽으려고 하며, 그 총 크기는 size * nmemb 바이트가 됩니다.

2.2. fread()의 반환값

fread()는 실제로 읽어들인 요소의 수를 반환합니다. 일반적으로 이 값은 nmemb과 같아야 하지만, EOF(파일의 끝)에 도달했거나 오류가 발생한 경우에는 그보다 작은 값이 반환될 수 있습니다.

3. fread() 사용 예

3.1. 간단한 코드 예시

다음 코드는 fread()를 사용하여 바이너리 파일에서 데이터를 읽는 기본적인 예입니다.
#include <stdio.h>

int main() {
    FILE *file;
    char buffer[10];

    file = fopen("example.bin", "rb");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.
");
        return 1;
    }

    size_t bytesRead = fread(buffer, sizeof(char), 10, file);
    printf("%zu 바이트를 읽었습니다.
", bytesRead);

    fclose(file);
    return 0;
}
이 예에서는 “example.bin”이라는 바이너리 파일을 열고, 10바이트를 읽고 있습니다. fread()가 성공하면 읽힌 바이트 수가 표시됩니다.

4. fread()의 주의점과 팁

4.1. 버퍼 크기 주의

fread()를 사용할 때는 버퍼의 크기가 충분한지 확인하십시오. 부적절한 크기를 지정하면 버퍼 오버플로가 발생하고, 예상치 못한 동작을 일으킬 수 있습니다.

4.2. EOF와 오류 검사

fread()는 EOF에 도달했거나 오류가 발생한 경우 nmemb보다 작은 값을 반환합니다. 따라서 읽기 작업이 완료되었는지, 오류가 발생했는지를 판단하기 위해 반환값을 항상 확인하는 것이 중요합니다.

5. 유사 함수와의 비교

5.1. fread()와 fgets()의 차이

fread()는 바이너리 데이터 읽기에 특화되어 있지만, fgets()는 텍스트 데이터 읽기에 사용됩니다. fgets()는 개행 문자까지의 데이터를 읽어 텍스트 파일 작업에 적합합니다.

5.2. fread()와 fscanf()의 차이

fscanf()는 포맷된 입력을 처리하기 위한 함수이며, 지정된 포맷에 따라 데이터를 읽어들입니다. 반면, fread()는 바이너리 데이터를 그대로 읽어 특정 포맷에 의존하지 않습니다.

6. fread()의 고급 사용 방법

6.1. 구조체 읽기

fread()는 구조체와 같은 복잡한 데이터 타입의 바이너리 표현을 직접 읽을 때에도 사용됩니다. 예를 들어, 아래와 같은 구조체를 파일에 저장하고 다시 읽을 수 있습니다.
typedef struct {
    int id;
    char name[20];
} Record;

Record record;
fread(&record, sizeof(Record), 1, file);

6.2. 성능 고려

fread()는 대량의 데이터를 효율적으로 읽기 위해 fgetc() 등 한 번에 1바이트씩 읽는 함수보다 빠릅니다. 대용량 파일을 다룰 때는 fread()와 같은 블록 읽기를 활용함으로써 성능을 향상시킬 수 있습니다.

7. 요약

fread()는 C 언어에서 바이너리 데이터를 읽기 위한 강력한 함수입니다. 적절히 사용하면 파일 내용을 효율적이고 안전하게 프로그램에 가져올 수 있습니다. 이 함수를 능숙하게 사용함으로써 바이너리 파일 작업에서 한 단계 진보한 프로그래밍이 가능해집니다.