fread(3)

#include <stdio.h>

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

open된 stream으로부터 바이너리 데이터를 읽습니다. size 크기의 데이터를 nmemb 회수만큼 stream에서 읽어서 ptr에 저장합니다. ptr은 size * nmemb의 크기보다 같거나 크게 메모리 할당되거나 배열로 잡아야 합니다.  return 값은 byte수가 아닌 size의 크기로 몇 개 읽었는 지를 return합니다. 읽은 byte수는 return값 * size입니다.

 

 

파라미터

ptr
    - 읽은 데이터를 저장하는 buffer 공간입니다.
      buffer의 크기는 size * nmemb 이상의 크기의 공간이 할당되어 있어야 합니다.
size
    - 한 item의 크기입니다.
      파일에 구조체를 통째로 write하였다면 sizeof(구조체)로 합니다.
nmemb
    - 읽을 item의 갯수입니다.
      파일에 구조체를 저장했다면 한번에 읽을 구조체 갯수를 설정합니다.
stream
    - fopen(3), fdopen(3) 등으로 생성한 읽을 stream입니다.

 

RETURN

nmemb
    - 읽으려는 nmemb만큼 정상적으로 모두 읽었습니다.

nmemb 보다 작음
    - 오류가 발생하였거나 end-of-file에 도달하여 더 읽을 데이터가 없습니다.
    - return 값으로 오류가 발생하였는 지, 정확하게 알 수 없습니다.
    따라서 feof(3)함수와 ferror(3)함수로 확인해야 합니다.

 


활용 예제

 

Sample : 파일을 복사하는 프로그램

#include <stdio.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[])
{
    FILE *wfp, *rfp;
    char buffer[4096];
    int  size;
    char sfile[1024];
    char dfile[1024];

    ......

    if(argc != 3) {
        fprintf(stderr, "Usage:\n\t%s src_file dest_file\n\t파일을 복제합니다.\n", argv[0]);
        return 1;
    }

    strcpy(sfile, argv[1]);
    strcpy(dfile, argv[2]);

    if((rfp = fopen(sfile, "r")) == NULL) {
        fprintf(stderr, "%s file open error: %s\n", sfile, strerror(errrno));
        return 1;
    }

    if((rfp = fopen(dfile, "w")) == NULL) {
        fprintf(stderr, "%s file open error: %s\n", dfile, strerror(errrno));
        return 1;
    }
    
    while((size = fread(buffer, 1, 4096, rfp)) > 0) {
        fwrite(buffer, 1, size, wfp);
    }

    fclose(rfp);
    fclose(wfp);

    return 0;
}

 


see also :

    File 속성 정보 및 파일 관리 Library

    Directory 정보 조회 및 관리 Library

    System Call File I/O Library

    Stream File I/O Library

 

 

블로그 이미지

사용자 자연&사람

행복한 개발자 programmer since 1995.

댓글을 달아 주세요