Linux

[Linux] file IO(고수준 파일) - fopen, fread, fwrite

개발로 먹고 살자 2022. 7. 27. 16:51

고수준 파일 입출력 

  바이트 스트림을 사용한 파일 입출력
  파일 지시자 - FILE *fp;
  특징 - 사용하기 쉬움, 버퍼 단위로 읽고 쓰기, 데이터의 입출력 동기화가 쉬움

 

FILE *fp; // 파일 포인터(저수준은 파일 기술자)
디스크에서 메모리로 읽어온 파일의 주소에 관한 정보를 담고 있는 포인터
파일 기술자는 정수형이지만 파일 포인터는 시스템 헤더 파일에 정의되어 있는데 FILE 포인터형

 

 

fopen

FILE *fopen(char *pathname, char *mode)
  pathname - 파일의 경로
  mode - 파일 열기 모드

options(mode)

  r - 읽기 전용
  w - 쓰기 전용, 기존 내용 삭제
  a - 기존 내용의 끝에 추가하여 쓰기 전용
  rb - 읽기 전용 바이너리 파일
  wb - 쓰기 전용 바이너리 파일
  r+ - 읽기와 쓰기용으로 텍스트 파일 열기

파일 포인터를 리턴, 실패하면 NULL

 

예시

FILE *fp;
if((fp = fopen(argv[0], "r")) == NULL) {
  printf("%s\n",strerror(errno));
  perror(argv[0]);
}

 

 

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp)
  ptr - 버퍼 주소
  size - 버퍼 크기
  nmemb - 읽어올 항목 수
  fp - 파일 포인터

 

항목의 크기가 size인 데이터를 nmemb에서 지정한 개수만큼 읽어 ptr이 가리키는 버퍼에 저장
성공하면 읽어온 항목 수를 리턴(읽은 오브젝트 파일 넘버)
읽을 항목이 없으면 0, 파일의 끝을 만나면 EOF(-1)

 

ex)

value = linux system programming
while((n =fread(buf, sizeof(char)*2, 4, rfp)) > 0) {
  buf[8] = '\0';
  printf(n = 4, buf = linux sy);
  항목의 크기를 2로 하고 한 번에 읽어올 개수를 4개로 지정 실제로는 8바이트씩 읽어옴
  n = 4 - 한 번에 4개 항목을 읽었음을 알 수 있음
}

 

 

fwrite

size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp)
  ptr - 버퍼 주소
  size - 항목의 크기
  nmemb - 항목 수
  fp - 파일 포인터

 

항목의 크기가 size인 데이터를 nmemb에서 
지정한 개수만큼 ptr에서 읽어 fp로 지정한 파일에 출력
성공하면 출력한 항목의 수를 리턴(쓴 오브젝트 파일 넘버)
오류가 발생하면 EOF(-1)

 

 

ex)

while((c = fread(temp, sizeof(char), 1, rfp)) > 0) {
1바이트의 크기를 1번 읽음
ex) sizeof(char), 100 - 1바이트를 100번 읽음
ex sizeof(100), 1 - 100바이트를 1번 읽음
동일한 결과
fwrite(temp, sizeof(char), 1, wfp);
1바이트의 크기를 1번 씀
}

 

 

fclose

int fclose(FILE *stream)
  stream - fopen()에서 리턴한 파일 포인터

성공하면 0, 실패하면 EOF(-1)

 

exercise - 파일 복사 프로그램

#include<stdio.h>
#include<fcntl.h>

int main(int argc, char *argv[]) {

	FILE *rfp;
    FILE *wfp;
    int c;
    char buf[1024];
    
    if((rfp = fopen(argv[1], "r")) == NULL) {
    	perror("open error");
    }
    
    if((wfp = fopen(argv[2], "w")) == NULL) {
    	perror("open error");
    }
    
    while((c = fread(buf, sizeof(char), 1, rfp)) > 0) {
    	fwrite(buf, sizeof(char), 1, wfp);
    }
    
    return 0;
}

buf를 char 사이즈만큼 하나씩 읽어서 wfp에 쓰는 프로그램이다.

 

현재 a.txt 파일에는 test programming 이 적혀 있다.

 

 

실행결과

 

b.txt에 성공적으로 복사하였다.