본문으로 바로가기

바다야크

  1. Home
  2. 컴퓨터/프로그래밍
  3. C언어 ftell 함수 파일 읽기·쓰기 위치 구하기

C언어 ftell 함수 파일 읽기·쓰기 위치 구하기

· 댓글개 · 바다야크

C ftell 함수 파일의 읽기·쓰기 위치 구하기 

파일의 읽기/쓰기 위치를 알려 줍니다.

  • 헤더: stdio.h
  • 형태: long ftell( FILE *stream)
  • 인수: FILE *stream 대상 파일 스트림
  • 반환: long 읽기/쓰기 위치를 반환, 오류가 발생하면 -1을 반환

파일을 열기 후에는 읽기/쓰기 위치는 0부터 시작됩니다. 그러나 잘못된 예제를 작성하면 엉뚱한 값으로 오해하게 됩니다. 즉, 아래는 잘못된 예제입니다. 왜냐하면, C 에서는 인수에 들어있는 함수의 수행은 오른쪽에서부터 먼저 실행하고 하기 때문에 주의해야 합니다.

#include <stdio.h>

int main( void)
{
   FILE *fp;
   char  chr_byte;
   int   ndx;

   fp = fopen( "./test.c", "r");

   for ( ndx = 0; ndx < 5; ndx++){
      printf( "pointer = %ld  char = %c\n", ftell( fp), fgetc( fp));
   }

   fclose( fp);

   return 0;
}

잘못된 예제로 실행해 보면 결과는 아래와 같습니다.

]$ ./a.out
pointer = 1  char = #  <- 두 번째 위치( 1 )에 '#' 문자가 출력
pointer = 2  char = i
pointer = 3  char = n
pointer = 4  char = c
pointer = 5  char = l
]$

이렇게 보면 첫 번째 문자 위치가 1 인것으로 착각할 수 있으므로 주의해야 합니다. 파일의 시작 위치에서 ftell() 값은 0입니다. 그럼에도 첫 번째 문자 '#'에 1이 나온 이유는 C언어의 인수 전달 순서가 뒤에서부터 전송하는 특성 때문입니다.즉, printf()의 인수 중 fgetc()가 먼저 실행한 후에 ftell()이 실행됩니다. 정확한 예제는 아래의 예제를 참고하세요.

C언어 ftell 함수 예제

#include <stdio.h>

int main( void)
{
   FILE *fp;
   char  chr_byte;
   int   ndx;

   fp = fopen( "./test.c", "r");

   for ( ndx = 0; ndx < 5; ndx++){
      printf( "pointer = %ld",  ftell( fp));   // ftell()을 먼저 실행
      printf( "    ");
      printf( "char = %c\n" , fgetc( fp));
   }

   fclose( fp);

   return 0;
}

C언어 ftell 함수 예제 실행 결과

]$ ./a.out
pointer = 0    char = #   <- 첫 번째 위치( 0 )에 '#' 문자가 출력
pointer = 1    char = i
pointer = 2    char = n
pointer = 3    char = c
pointer = 4    char = l
]$
SNS 공유하기
💬 댓글 개
이모티콘창 닫기
울음
안녕
감사해요
당황
피폐

이모티콘을 클릭하면 댓글창에 입력됩니다.