고수준 파일 입출력
바이트 스트림을 사용한 파일 입출력
파일 지시자 - 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에 성공적으로 복사하였다.
'Linux' 카테고리의 다른 글
[Linux] 하드링크, 심볼릭링크 (0) | 2022.08.05 |
---|---|
[Linux] 디렉토리와 파일 정보 조작하기 (0) | 2022.08.05 |
[Linux] 파일 입출력 IO (0) | 2022.07.27 |
[Linux] 파일 오프셋 - lseek (0) | 2022.07.27 |
[Linux] file IO(저수준 파일) - open, read, write (0) | 2022.07.27 |