이 글에서는 C++에서 fread() 함수가 어떻게 동작하는지 알아봅니다. 아울러 fread()에 전달되는 다양한 매개변수와 이 함수가 반환하는 값에 대해서도 자세히 살펴보겠습니다.
fread()는 스트림(stream)에서 데이터 블록을 읽어오는 C++의 내장 함수입니다. 이 함수는 스트림에서 각각 "size" 바이트 크기를 가진 객체를 count개만큼 읽어 버퍼 메모리에 저장하며, 읽기가 완료되면 위치 포인터(position pointer)는 읽어온 총 바이트 수만큼 앞으로 이동합니다. 읽기가 성공하면 읽어온 바이트 수는 size × count가 됩니다.
문법
fread(void *buffer, size_t size, size_t count, FILE *file_stream);
매개변수
이 함수는 총 4개의 매개변수를 모두 필요로 합니다. 각 매개변수를 하나씩 살펴보겠습니다.
buffer − 스트림에서 읽어온 바이트가 저장될 버퍼 메모리 블록의 포인터입니다.
size − 읽어올 각 요소의 크기를 바이트 단위로 정의합니다. (size_t는 unsigned int 타입입니다.)
count − 읽어올 요소의 개수입니다.
file_stream − 바이트를 읽어올 대상 파일 스트림의 포인터입니다.
반환값
성공적으로 읽어온 요소의 개수가 반환됩니다.
읽기 오류가 발생하거나 파일 끝(end-of-file)에 도달한 경우에는 반환되는 요소의 개수가 count 변수와 다를 수 있습니다.
예제
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
int main() {
FILE* file_stream;
char buf[100];
file_stream = fopen("tp.txt", "r");
while (!feof(file_stream)) { // 파일을 읽습니다
// 파일의 내용을 읽어옵니다.
fread(buf, sizeof(buf), 1, file_stream);
cout << buf;
}
return 0;
}
tp.txt 파일에 다음과 같은 내용이 저장되어 있다고 가정해 보겠습니다.
tutorialspoint
Contribution
anything here
출력
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
tutorialspoint Contribution anything here
이번에는 count가 0이고 size가 0일 때 어떤 결과가 나오는지 확인해 보겠습니다.
예제
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
FILE *fp;
char buffer[100];
int retVal;
fp = fopen("tpempty.txt","rb");
retVal = fread(buffer,sizeof(buffer),0,fp);
cout << "The count = 0, then return value = " << retVal << endl;
retVal = fread(buffer,0,1,fp);
cout << "The size = 0, then value = " << retVal << endl;
return 0;
}
출력
위 코드를 실행하면 다음과 같은 결과가 출력됩니다 −
The count = 0, then return value = 0 The size = 0, then value = 0
마무리
fread()는 이진 파일이나 대용량 데이터를 한 번에 효율적으로 읽어올 때 유용하게 활용할 수 있는 함수입니다. 특히 count나 size가 0이면 아무것도 읽지 않고 0을 반환한다는 점, 그리고 파일 끝에 도달하면 반환값이 count보다 작아질 수 있다는 점을 기억해 두면 좋습니다. 안전한 코드를 작성하려면 fread()의 반환값을 반드시 확인하여 실제로 읽어온 데이터의 양을 검증하는 습관을 들이는 것이 좋습니다.