ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • ftell(), rewind()
    Visual Studio/C 기초 2012. 11. 4. 16:07

    일단 설명을 드리기 전에 잠시만 읽어주세요. :)

    OS 내 열려 있는 모든 파일은 관련된 파일 위치 표시를 가지고 있습니다. 위치 표시는 파일에서 일기와 쓰기 동작이 수행되는 위치를 가리키는데요, 위치는 항상 파일의 시작을 기준으로 해서 바이트 단위로 표현됩니다.

    새로운 파일을 열 때 위치 표시는 항상 파일의 시작 부분인 위치 0을 가리킵니다. 새로운 파일의 길이는 0이므로 다른 곳을 가리킬 수 없습니다. 만약 이미 존재하는 파일을 열 때 파일이 추가 가능한 상태로 열리면 위치 표시는 파일의 마지막을 가리키게 되고 파일의 다른 어떤 모드로 열리면 파일의 시작 부분을 가리키게 됩니다.

    ftell(), rewind()

    위치 표시가 파일의 시작 부분을 가리키도록 설정하기 위해서 rewind()를 사용합니다.

    void rewind(FILE *fp);

    fp는 스트림과 관련되어 있는데, rewind()를 호출한 후에 파일의 위치 표시는 파일의 시작 부분인 바이트 0을 가리킵니다. 파일에서 약간의 데이터를 읽어들인 후에 파일을 닫고 나서 다시 열지 않고도 파일의 시작 부터 다시 읽어들이기 원한다면 rewind()를 사용하시면 됩니다.

    파일의 위치 표시 값을 설정하기 위해 ftell()을 사용하면 됩니다.

    long ftell(FILE *fp);

    이것도 마찬가지로 fp는 스트림과 관련되어 있습니다. 함수 ftell()은 파일의 시작부터 현재 파일의 위치까지를 바이트 단위로 나타내는 long형 값을 돌려줍니다. 첫 번째 바이트의 위치는 0인데 만약 에러가 발생하면 ftell()은 -1의 long형인 -1L을 돌려줍니다. 예제를 보겠습니다.

     

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

    char msg[] = "abcdefghijklmnopqrstuvwxyz";

    main(){
     FILE *fp;
     char buf[6];
     char filename[20];
     puts("파일을 쓰기모드로 입력하기 위해 파일명을 입력해주세요.");
     gets(filename);

     if((fp=fopen(filename,"w")) == NULL){
      fprintf(stderr,"파일을 불러오는데 실패했습니다!\n");
      exit(1);
     }
     
     if(fputs(msg,fp) ==EOF){
      fprintf(stderr,"파일을 쓰는데 실패했습니다!\n");
      exit(1);
     }

     fclose(fp);
     if((fp=fopen(filename,"r"))==NULL){
      fprintf(stderr,"파일을 불러오는데 실패했습니다!\n");
      exit(1);
     }
     printf("파일을 읽어 들인 후의 첫 위치 = %ld", ftell(fp));

     fgets(buf, 6, fp);
     printf("\nabcde를 읽어들인 후 %s의 위치 = %ld", buf,ftell(fp));

     fgets(buf,6,fp);
     printf("\n다음 5개의 문자는 %s, 지금의 위치는 %ld입니다.\n",buf,ftell(fp));

     rewind(fp); //스트림을 시작부분으로 설정합니다.

     printf("시작 부분으로 변경후 위치는 %ld로 돌아갑니다.\n",ftell(fp));

     fgets(buf,6,fp);
     printf("다시 읽기 시작 : %s\n",buf);
     fclose(fp);

    살짝 복잡하지만 금방 이해하실 겁니다.

     

     

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

    feof()  (0) 2013.02.14
    fseek()  (0) 2012.11.05
    fscanf(), fwrite(), fread()  (0) 2012.11.04
    fprintf()  (0) 2012.10.22
    fopen()  (0) 2012.10.16

    댓글

Designed by Tistory.