연재 완료/C Lang 이론

C언어 이론 12. 파일처리(고수준의 파일 입출력 3. 블럭 단위 입출력 등)

라이피 (Lypi) 2018. 6. 19. 18:48
반응형

내용 출처 : 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) 등도 있다. (생략)





반응형