FILE *fp;
fp = fopen("test.txt","w"); / 첫번째 " " 안에는 파일 이름을 나타낸다, 문자열 상수 , 배열에 담아서도 가능.
두번째 " " 매개변수인 모드 .
FILe은 stdio.h에 typedef을 이용하여 선언된 구조체 자료형 .
fopen 실패 -> NULL 포인터가 반환
[모드 종류]
r : 읽기 모드로 파일 엶, 파일 없으면 오류 발생 / + 쓰기 모드로 전환가능
w : 쓰기 모드 , 파일 이미 존재하면 기존의 내용 지워짐 / + 읽기 모드로 전환가능
a : 추가 모드 , 기존의 파일이 있으면 데이터가 파일의 끝에 추가 , 없으면 새로운 파일을 만든다. / + 읽기로 전환가능
+모드에서 변환시 fflush() , fsetpos() , fseek() , rewind() 중의 하나를 호출해야 전환됨.
default값은 "t" 텍스트 파일 모드 ,
[파일 닫기]
fclose(fp);
성공적으로 닫는 경우 -> 0 반환
실패 -> -1
[파일 삭제]
remove() 성공=0 / 실패 = -1
[텍스트 파일 읽기 / 쓰기]
Input fuc Output fuc.
문자 단위 int fgetc(FILE *fp) int fputc(int c , FILE *fp)
문자열 단위 char *fgets(char *buf, int n , int fputs(const char *buf , FILE *fp)
FILE *fp, ...)
-> 설명 char *buf에 문자열을 저장 , int n에는 최대 개수를 입력.
서식화된 int fscanf(FILE *fp , ...) int fprintf("FILE *fp , ...)
입출력
이진 데이터 size_t fread(char *buffer, int size, size_t fwrite(char *buffer, int size,
int count, FILE *fp) int count, FILE *fp)
이들 함수들은 성공적으로 읽은 항목의 개수를 반환한다. 따라서 값이 0이면 입출력이 실패.
서식화된 입출력은 fprintf() , fscanf() 를 사용
EOF(end of file) = -1
[형식화된 입출력]
int fprintf(FILE *fp , const char *format, ...);
int fscanf(FILE *fp, const char *format, ...);
* printf() 대신에 fprintf(stderr, ... ,)을 쓰는 이유
printf()는 출력 버퍼에 저장 돼 있다가 화면에 출력되어 , 버퍼에 찰 때 시간이 있어 그 사이에 프로그램이 죽으면 버퍼의 내용을 확인불가.
하지만 fprintf(stderr,...,)는 버퍼 없이 바로 출력.
[이진 파일 읽기와 쓰기]
Text file 에서는 모든 정보가 문자열로 변환돼서 파일에 기록. 123456 -> '1','2','3','4','5','6' 이런 변환은 fprintf()함수가 담당. 이것을 fscanf()가 읽어 정수 123456으로 변환.
Binary file은 데이터가 직접 저장돼 있는 파일. 정수 123456이 문자열로 변환되지 않고 2진수 형태로 그대로 파일에 기록, 하나의 정수는 4바이트로 표현되므로 4바이트가 파일에 저장.
장점 : 효율성
읽기,쓰기 기능은 b만 추가하면됨 .
Syntax : fwrite(buffer, sizeof(int), size, fp);
-> buffer : 메모리 블록의 주소 , sizeof(int) : 항목의 크기 , size : 항목의 개수, fp : FILE 포인터
-[이진 파일 읽기]
fread()는 이진 파일에서 데이터를 읽어서 buffer에 저장한다. ( 형식은 fwrite()와 동일)
fread(buffer, sizeof(int), size, fp);
[버퍼링]
버퍼란 데이터의 임시 저장장소 .
fflush(fp);를 통해서 버퍼를 바로 비울 수 있다.
읽기 모드 -> 단순히 비워짐
쓰기 모드 -> 버퍼의 내용이 디스크에 기록됨.
입출력에서 버퍼를 제거하려면 setbuf() 함수를 사용.
setbuf(fp, NULL);
하지만 버퍼 없으면 시스템 호출이 필요하므로 속도가 느려지고 비효율적이다.
[임의 접근]
순차 접근과 임의 접근
Sequential access(순차 접근) : 처음부터 순차적으로 읽거나 기록하는 것
Random access(임의 접근) : 파일의 어느 위치에서든지 읽기와 쓰기 가능 .
위치 표시자를 조작하는 함수 : fseek()
Syntax : fseek()
int fseek(FILE *fp, long offset, int origin);
fp : FILE 포인터 , offset : 기준 위치로부터 위치 표시자가 이동하는 거리 (양수이면 앞으로 , 음수이면 뒤로 간다) , origin은 위치 표시자를 이동시키는 기준위치.
SEEK_SET : 0 / 파일의 시작
SEEK_CUR : 1 / 현재 위치
SEEK_END : 2 / 파일의 끝
파일 포인터를 파일의 시작 위치로 설정하려면 fseek()를 사용해도 되지만 rewind()라이브러리 함수도 마찬가지의 역할을 한다.
rewind()가 호출되면 위치 표시자 0 으로 설정.
Syntax : ftell()
long ftell(FILE *fp);
현재의 위치 표시자의 값을 long형으로 변환한다. 오류 발생시 -1L을 반환한다.
Syntax : foef()
int feof(FILE *fp);
파일의 끝을 알아내는 함수. 현재 위치가 파일의 끝인지를 알려준다. 이진 파일에서는 -1이 데이터일 수도 있기 떄문이다.
'기타 > 구' 카테고리의 다른 글
[2020.12.02] 기말 계획 (0) | 2020.12.04 |
---|---|
[C express] Ch.16 전처리 및 다중 소스 파일 (1/2) (0) | 2020.12.04 |
[ch.00] Make a plan (0) | 2020.11.19 |
[C 언어 Ex] ch.17 : 07 (0) | 2020.11.15 |
[SWEA]홀수만 더하기_py (0) | 2020.11.14 |
댓글