ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • fseek()
    Visual Studio/C 기초 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);

     

    'Visual Studio > C 기초' 카테고리의 다른 글

    remove()  (0) 2013.05.15
    feof()  (0) 2013.02.14
    ftell(), rewind()  (0) 2012.11.04
    fscanf(), fwrite(), fread()  (0) 2012.11.04
    fprintf()  (0) 2012.10.22

    댓글

Designed by Tistory.