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이 아닌 값을 반환하므로, 반환값을 반드시 확인하는 것이 좋습니다.