Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 파일 랜덤 액세스 완벽 가이드: ftell, rewind, fseek 함수 활용법

C 언어에서는 순차적으로 파일을 읽고 쓰는 것 외에도, 파일 내 임의의 위치에 직접 접근하는 랜덤 액세스(Random Access)가 가능합니다. 이를 위해 다음 세 가지 표준 라이브러리 함수가 사용됩니다.

  • ftell() — 파일 포인터의 현재 위치 확인
  • rewind() — 파일 포인터를 파일의 처음으로 이동
  • fseek() — 파일 포인터를 원하는 특정 위치로 이동

각 함수의 동작 원리와 사용법을 자세히 살펴보겠습니다.

1. ftell() — 현재 파일 위치 반환

ftell() 함수는 파일 포인터(file pointer)가 현재 가리키고 있는 위치, 즉 파일 시작부터 현재 위치까지의 바이트 오프셋을 long형 정수로 반환합니다.

문법

long n = ftell(file pointer);

사용 예시

FILE *fp;
long n;
// ... 파일 열기 및 작업 ...
n = ftell(fp);   // fp의 현재 위치(바이트 단위)를 n에 저장

활용 팁ftell()은 파일에 입력된 문자(바이트) 수를 계산하는 데 유용하게 사용됩니다. 예를 들어 파일을 끝까지 읽은 후 ftell()을 호출하면 전체 파일 크기를 알 수 있습니다.

2. rewind() — 파일 포인터를 처음으로 되돌리기

rewind() 함수는 파일 포인터를 파일의 맨 처음(beginning)으로 이동시킵니다. 파일을 다시 처음부터 읽거나 써야 할 때 유용합니다.

문법

rewind(file pointer);

사용 예시

FILE *fp;
// ... 파일 작업 ...
rewind(fp);          // 파일 포인터를 맨 처음으로 이동
n = ftell(fp);
printf("%ld", n);    // 항상 0 출력

출력 결과

0 (항상)

rewind() 호출 직후에는 파일 포인터가 항상 시작 위치(오프셋 0)에 있으므로, ftell()의 반환값은 항상 0입니다.

3. fseek() — 특정 위치로 파일 포인터 이동

fseek() 함수는 파일 포인터를 파일 내 원하는 임의의 위치로 이동시킵니다. 랜덤 액세스의 핵심 함수입니다.

문법

fseek(file pointer, offset, position);

offset (오프셋)

읽기 또는 쓰기를 위해 이동할 바이트 수를 의미하며, 음수 또는 양수 값을 가질 수 있습니다.

  • 양수(+) — 파일의 앞쪽(forward) 방향으로 이동
  • 음수(-) — 파일의 뒤쪽(backward) 방향으로 이동

position (위치 기준점)

오프셋을 계산할 기준 위치로, 다음 세 가지 값을 가질 수 있습니다.

  • 0 — 파일의 시작(Beginning of file)
  • 1 — 파일 포인터의 현재 위치(Current position)
  • 2 — 파일의 끝(End of file)

참고로 <stdio.h> 헤더에는 각각 SEEK_SET(0), SEEK_CUR(1), SEEK_END(2)라는 매크로 상수가 정의되어 있어, 숫자 대신 사용하면 코드의 가독성이 향상됩니다.

fseek() 사용 예제

  • fseek(fp, 0, 2) — 파일의 끝에서 0바이트 앞쪽으로 이동 (파일 끝 위치)
  • fseek(fp, 0, 0) — 파일의 시작에서 0바이트 앞쪽으로 이동 (파일 처음 위치)
  • fseek(fp, m, 0) — 파일의 시작에서 m바이트 앞쪽으로 이동
  • fseek(fp, -m, 2) — 파일의 끝에서 m바이트 뒤쪽으로 이동

fseek() 관련 오류 사례

다음과 같은 호출은 잘못된 위치 지정으로 인해 오류를 발생시킬 수 있습니다.

  • fseek(fp, -m, 0) — 파일의 시작보다 더 뒤쪽으로 이동하려는 시도 (음수 영역은 존재하지 않음)
  • fseek(fp, +m, 2) — 파일의 끝보다 더 앞쪽으로 이동하려는 시도 (파일 범위를 벗어남)

이처럼 기준 위치(position)와 이동 방향(offset의 부호)이 논리적으로 모순되면 fseek()은 실패하며 0이 아닌 값을 반환하므로, 반환값을 반드시 확인하는 것이 좋습니다.