NAME

fread, fwrite - 이진 스트림 입출력

SYNOPSIS

#include <stdio.h>

size_t fread(void *restrict ptr, size_t size, size_t nmemb,
             FILE *restrict stream);
size_t fwrite(const void *restrict ptr, size_t size, size_t nmemb,
             FILE *restrict stream);

DESCRIPTION

fread() 함수는 stream이 가리키는 스트림에서 각기 size 바이트 길이인 데이터 항목 nmemb 개를 읽어서 ptr로 지정한 위치에 저장한다.

fwrite() 함수는 ptr로 지정한 위치에서 얻은 각기 size 바이트 길이인 데이터 항목 nmemb 개를 stream이 가리키는 스트림에 써 넣는다.

대응하는 논블로킹 버전은 unlocked_stdio(3) 참고.

RETURN VALUE

성공 시 fread()fwrite()는 읽거나 쓴 항목 개수를 반환한다. size가 1인 경우에만 그 수가 이동된 바이트 수와 같다. 오류가 발생했거나 파일 끝에 도달했으면 지정한 항목 개수에 모자란 값을 (또는 0을) 반환한다.

성공적으로 읽거나 쓴 바이트 수만큼 스트림의 파일 위치 표시가 전진한다.

fread()에서 파일 끝과 오류를 구별하지 않으므로 호출자가 feof(3)ferror(3)를 써서 어느 경우인지 알아내야 한다.

ATTRIBUTES

이 절에서 사용하는 용어들에 대한 설명은 attributes(7)를 보라.

인터페이스 속성
fread(), fwrite() 스레드 안전성 MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, C89.

EXAMPLES

아래 프로그램은 fread() 사용 방식을 보여 주는데, ELF 실행 파일 /bin/sh을 바이너리 모드로 파싱해서 매직 값과 유형을 찍는다.

$ ./a.out
ELF magic: 0x7f454c46
Class: 0x02

프로그램 소스

#include <stdio.h>
#include <stdlib.h>

#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

int
main(void)
{
    FILE *fp = fopen("/bin/sh", "rb");
    if (!fp) {
        perror("fopen");
        return EXIT_FAILURE;
    }

    unsigned char buffer[4];

    size_t ret = fread(buffer, sizeof(*buffer), ARRAY_SIZE(buffer), fp);
    if (ret != ARRAY_SIZE(buffer)) {
        fprintf(stderr, "fread() failed: %zu\n", ret);
        exit(EXIT_FAILURE);
    }

    printf("ELF magic: %#04x%02x%02x%02x\n", buffer[0], buffer[1],
           buffer[2], buffer[3]);

    ret = fread(buffer, 1, 1, fp);
    if (ret != 1) {
        fprintf(stderr, "fread() failed: %zu\n", ret);
        exit(EXIT_FAILURE);
    }

    printf("Class: %#04x\n", buffer[0]);

    fclose(fp);

    exit(EXIT_SUCCESS);
}

SEE ALSO

read(2), write(2), feof(3), ferror(3), unlocked_stdio(3)


2021-03-22