내용 출처 : YES C (정보공학연구소 /생능출판사)
혼자 연구하는 C/C++ (SoEn.kr /와우북스)
Ⅰ. fread()/ fwrite() // 블럭 단위 파일 입출력 함수
① 텍스트 형식 입출력 함수는 쉽고 유용하지만 부수적인 데이터 변환을 수행해야 하므로 효율적인 방법은 아니다.
② 또한 데이터 크기에서도 텍스트 파일은 이진 파일에 비해 큰편이다.
③ 이진 파일은 저장된 데이터를 확인하기는 어렵지만 속도와 크기면에서 훨씬 유리하다.
④ 원형
int fread (char* buffer, int size, int n, FILE* fp); int fwrite(char* buffer, int size, int n, FILE* fp);
⑤ fread(buffer,size,n,fp)는 파일 포인터 fp가 가리키는 파일로부터 size 바이트인 데이터 블록은 n개 만큼 읽어 buffer가 가리키는 기억장소에 저장한다.
⑥ 이 때, 버퍼의 크기는 size*n 바이트보다 커야하며, 파일의 끝에 남은 데이터가 size 바이트 미만이면 그 블록은 읽어지지 않는다.
⑦ fread()는 정상적으로 읽어낸 블록의 수를 반환하며, 파일의 끝을 만나거나 에러가 발생하는 경우에는 0을 반환한다.
⑧ fwrite(buffer,size,n,fp)는 buffer가 가리키는 기억장소로부터 size 바이트인 데이터 블록을 n개 만큼 읽어 파일 포인터 fp가 가리키는 파일에 출력한다.
⑨ fwrite()는 정상적으로 파일이 기록된 블록의 수를 반환하며, 지정된 블록 수와 반환되는 블록 수가 다르면 오류로 간주해 0을 반환한다.
Ⅱ. 순차 파일과 랜덤 파일
① 순차 파일 (seqential file) : 파일의 처음부터 끝까지 순차적으로 쓰거나 읽는 것만 가능한 파일
② 랜덤 파일 (random file) : 파일의 어떤 지점이든 임의로 전근하여 일정한 데이터 크기 단위로 읽고 쓰는 것이 가능한 파일
③ 랜덤 파일의 경우 한 파일의 레코드 길이는 모두 같고, 임의의 데이터를 읽고 쓰는 것이 가능하며, 블록(레코드)의 내용 변경이 용이하다.
④ 하지만 기억장소의 낭비가 심하다는 단점이 있다.
Ⅲ, fseek(), ftell(), rewind(), fflush() // 랜덤 파일 함수
① 헤더파일 : stdio.h, 원형
int fseek(FILE* _Stream, long _Offset, int _Origin); long ftell(FILE* _Stream); void rewind(FILE* _Stream); int fflush(FILE* _Stream);
② fseek(fp, offset, mode)는 파일 포인터 fp의 위치를 mode로 지정한 시작점으로부터 offset바이트 떨어진 곳으로 이동시킨다.
③ fseek()는 포인터의 이동이 정상적으로 수행되면 0을 반환하고, 그렇지 않으면 -1을 반환한다.
④ offset이 양수이면 앞으로 이동하고, 음수이면 뒤로 이동한다.
⑤ mode의 종류는 다음의 세가지가 있다.
1) SEEK_SET : 파일의 맨 처음.
2) SEEK_CUR : fp의 현재 위치.
3) SEEK_END : 파일의 맨 끝.
⑥ ftell(fp)는 파일 포인터 fp의 현재 위치를 반환한다. 이 때, 파일의 현재 위치는 파일의 시작점에서의 파이트 수로 나타낸다. 실패시 -1L을 반환한다.
⑦ rewind(fp)는 파일 포인터 fp가 가리키는 현재 위치를 그 파일의 처음 위치로 되돌린다. 반환값은 없다.
(즉, fseek(fp,0,SEEK_SET)과 같다.)
⑧ fflush(fp)는 지정한 스트림에 대한 버퍼를 모두 비운다. 버퍼를 비운뒤 파일을 닫지는 않는다.
⑨ 정상적으로 수행되면 0을 반환하고, 그렇지 않으면 EOF(-1)을 반환한다.
Ⅳ. feof(), ferror() // 오류 처리
① 헤더파일 : stdio.h, 원형
int feof(FILE* _Stream); int ferror(FILE* _Stream);
② feof(fp)는 fp가 EOF를 검출했는지를 확인하는 함수다. fp의 위치가 EOF일 경우 참(1)을 아닌 경우에는 거짓(0)을 반환한다.
③ ferror(fp)는 파일 입출력 시 오류 발생 여부를 검사하는 함수다. 입출력 중 에러가 발생하면 참(1)을, 아닌 경우 거짓(0)을 반환한다.
④ 그 외에도 perror(문자열), stterror(오류번호), clearerr(FILE* fp) 등도 있다. (생략)