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

C++ fread() 함수 완벽 정리: 문법, 매개변수, 반환값과 예제

이 글에서는 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()의 반환값을 반드시 확인하여 실제로 읽어온 데이터의 양을 검증하는 습관을 들이는 것이 좋습니다.