Core Programming/C Standard Library: Resource & Performan

C언어 파일 포인터 위치 제어: fseek, ftell, rewind 완벽 가이드

임베디드 친구 2025. 2. 7. 09:37
반응형

C언어에서 파일을 다룰 때, 단순히 앞에서부터 순차적으로 읽는 것이 아니라 원하는 위치로 건너뛰거나 현재 어디까지 읽었는지 확인해야 할 때가 있습니다. 이를 임의 접근(Random Access)이라고 합니다.

오늘은 stdio.h에서 제공하는 파일 위치 제어의 핵심 3인방, fseek, ftell, rewind 함수를 완벽하게 정리해 보겠습니다.

Generated by Gemini AI.


1. 파일 포인터(File Pointer)의 개념

C언어에서 파일은 스트림(Stream)으로 관리됩니다. 우리가 파일을 열면 FILE * 타입의 포인터가 생성되는데, 이 포인터는 파일 내의 '현재 읽기/쓰기 위치(Cursor)'를 가리키는 역할을 합니다.


2. fseek: 파일 포인터 위치 이동하기

fseek 함수는 파일 내에서 내가 원하는 지점으로 커서를 강제 이동시키는 함수입니다.

2.1 함수 원형 및 매개변수

C
 
int fseek(FILE *stream, long offset, int whence);
  • offset: 이동할 바이트 수 (양수면 뒤로, 음수면 앞으로 이동)
  • whence: 이동의 기준점
    • SEEK_SET: 파일의 시작 기준
    • SEEK_CUR: 현재 위치 기준
    • SEEK_END: 파일의 기준

2.2 활용 예제

C
 
// 파일 시작으로부터 10바이트 뒤로 이동
fseek(fp, 10, SEEK_SET);

// 현재 위치에서 5바이트 앞으로 이동
fseek(fp, -5, SEEK_CUR);

3. ftell: 현재 위치 확인하기

ftell 함수는 파일의 시작점으로부터 현재 파일 포인터가 몇 바이트 지점에 있는지를 반환합니다.

3.1 함수 원형

C
 
long ftell(FILE *stream);
  • 반환값: 현재 위치(바이트 단위). 실패 시 -1을 반환합니다.

[핵심 활용] 파일 크기(Byte) 구하기

실무에서 가장 많이 쓰이는 기법입니다. 끝으로 이동시킨 뒤 위치를 읽으면 파일 전체 크기가 됩니다.

C
 
fseek(fp, 0, SEEK_END); // 끝으로 이동
long size = ftell(fp);  // 현재 위치 읽기 (곧 전체 크기)
printf("파일 크기: %ld bytes\n", size);

4. rewind: 처음으로 되돌리기

rewind 함수는 이름 그대로 파일 포인터를 가장 처음(SEEK_SET, 0바이트 위치)으로 되감는 함수입니다.

4.1 함수 원형 및 특징

C
 
void rewind(FILE *stream);
  • fseek(fp, 0, SEEK_SET);과 동일한 동작을 수행하지만, 반환값이 없고 더 직관적입니다.
  • 파일 읽기를 마치고 다시 처음부터 작업해야 할 때 필수적입니다.

5. 실전 종합 예제: 파일 크기 확인 및 중간 데이터 읽기

C
 
#include <stdio.h>

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (fp == NULL) {
        perror("파일 열기 에러");
        return 1;
    }

    // 1. 파일 크기 계산
    fseek(fp, 0, SEEK_END);
    long fileSize = ftell(fp);
    printf("파일 크기: %ld 바이트\n", fileSize);

    // 2. 파일의 중간 지점으로 이동
    fseek(fp, fileSize / 2, SEEK_SET);
    printf("중간 지점(%ld바이트)으로 이동했습니다.\n", ftell(fp));

    // 3. 다시 처음으로 되돌리기
    rewind(fp);
    printf("rewind 호출 후 현재 위치: %ld\n", ftell(fp));

    fclose(fp);
    return 0;
}

6. [주의사항] 텍스트 모드 vs 바이너리 모드

fseek와 ftell을 사용할 때 주의할 점이 있습니다.

  • 바이너리 모드("rb", "wb"): 바이트 단위 이동이 정확하게 일치합니다.
  • 텍스트 모드("r", "w"): 줄바꿈 문자(\n) 처리가 운영체제마다 다르기 때문에, ftell로 얻은 값이 실제 물리적인 바이트 수와 다를 수 있습니다. 정확한 위치 제어가 필요하다면 바이너리 모드 사용을 권장합니다.

마무리

파일 위치 제어 함수는 대용량 파일을 효율적으로 처리하거나 데이터베이스 시스템을 직접 구현할 때 반드시 이해해야 하는 도구입니다. fseek로 이동하고, ftell로 확인하며, rewind로 초기화하는 흐름을 꼭 기억하세요!


포스팅이 도움이 되셨다면 하트(♥)와 댓글 부탁드립니다!

임베디드 소프트웨어 및 최적화 기법에 대한 전문적인 정보는 'Coding by Head' 블로그에서 계속됩니다.

https://coding-by-head.tistory.com/

반응형