낙락장송s 2012. 11. 5. 18:18

fseek()

앞의 포스트에서 ftell()과 rewind()를 이용해 위치표시를 재설정하는 방법에 대해 설명했습니다. fseek()는 스트림의 위치표시를 더욱 정확하게 제어하기 위해서 사용되는 함수입니다. fseek()를 사용하면 위치표시가 파일 내에서 랜덤한 위치를 가리키도록 설정할 수 있습니다.

fseek(FILE *fp, long offset, int origin);

fp는 파일에 대한 포인터입니다. 자주 언급하는 내용이니 넘어가겠습니다. 위치표시가 이동되는 거리는 offset에 바이트 단위로 지정되기 때문에 sizeof()많이 사용합니다. origin은 이동이 시작되는 위치를 지정합니다. origin에 사용할 수 있는 기호 상수가 따로 있기 때문에 알려드리겠습니다.

*origin에 사용할 수 있는 기호상수는 io.h에 정의되어 있기 때문에 io.h도 포함시켜주시기 바랍니다.

 

SEEK_SET 

 0

 위치표시를 파일의 시작부터 offset 바이트 뒤로 이동합니다. 

SEEK_CUR

 1

 위치표시를 현재 위치에서 offset 바이트 뒤로 이동합니다.

SEEK_END 

 2

 위치표시를 파일의 마지막부터 offset 바이트 앞으로 이동합니다.

fseek()함수의 동작이 성공적이라면 0을 돌려주고 에러가 발생하면 0이 아닌 다른 값을 돌려줍니다.(반드시 -1을 돌려주는 것은 아니니 주의해주세요!) 예제를 보겠습니다.

 

#include <stdio.h>
#include <stdlib.h>
#include <io.h>

#define MAX 50

main(){
 FILE *fp;
 int data, count, arr[MAX];
 long offset;
 char filename[20];
 for(count=0; count<MAX; count++)           //배열을 초기화 합니다.
  arr[count]=count*10;

 puts("쓰기상태로 파일을 엽니다. 파일이름을 입력해주세요.");
 gets(filename);
 if((fp=fopen(filename,"wb"))==NULL){
  fprintf(stderr,"파일을 여는데 실패했습니다!\n");
  exit(1);
 }

 if((fwrite(arr,sizeof(int),MAX,fp)) !=MAX)
 {
  fprintf(stderr,"파일에 데이터를 쓰는데 실패했습니다!\n");
  exit(1);
 }
 fclose(fp);

 if((fp=fopen(filename,"rb"))==NULL){
  fprintf(stderr,"파일을 여는데 실패했습니다!\n");
  exit(1);
 }

 while(1)
 {
  printf("요소 0~%d를 읽어들입니다. -1를 입력하면 프로그램은 종료됩니다. : ",MAX-1);
  scanf("%d",&offset);
  if(offset < 0)
   break;
  else if(offset > MAX-1)
   continue;

  if((fseek(fp,(offset*sizeof(int)),SEEK_SET)) != 0){  //위치 표시를 파일의 시작으로부터 0만큼 뒤로 이동시킵니다.
   fprintf(stderr,"함수 fseek()사용 오류입니다.\n");
   exit(1);
  }
  fread(&data,sizeof(int),1,fp);
  printf("입력한 요소 %ld의 값은 %d입니다.\n",offset,data);
 }
 fclose(fp);