c 언어/c 표준 라이브러리(Standard C Library)

C 언어 파일 포인터와 위치 조정 - fseek, ftell, rewind

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

C 언어에서 파일을 다룰 때 파일 포인터를 사용하여 원하는 위치로 이동하고, 현재 위치를 확인하는 기능이 필요합니다. 이를 위해 stdio.h에서 제공하는 fseek, ftell, rewind 함수를 사용할 수 있습니다.

이번 글에서는 파일 포인터의 개념과 함께 fseek, ftell, rewind 함수의 사용법을 예제 코드와 함께 설명하겠습니다.

1. 파일 포인터란?

C 언어에서 파일은 스트림(stream)으로 관리되며, FILE * 타입의 파일 포인터를 통해 조작됩니다. 파일 포인터는 현재 파일에서 읽기/쓰기 작업을 수행할 위치를 가리킵니다.

파일의 특정 위치로 이동하거나 현재 위치를 확인하려면 fseek, ftell, rewind 함수를 활용할 수 있습니다.

2. fseek 함수

fseek 함수는 파일 포인터를 원하는 위치로 이동시키는 함수입니다.

사용법

int fseek(FILE *stream, long offset, int whence);
  • stream: 파일 포인터
  • offset: 이동할 바이트 수
  • whence: 기준 위치 (SEEK_SET, SEEK_CUR, SEEK_END)
  • 반환값: 성공하면 0, 실패하면 -1

whence 값의 의미

  • SEEK_SET: 파일의 시작점을 기준으로 이동
  • SEEK_CUR: 현재 위치를 기준으로 이동
  • SEEK_END: 파일의 끝을 기준으로 이동

예제: fseek 사용하기

#include <stdio.h>

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

    // 파일의 처음에서 10바이트 이동
    fseek(fp, 10, SEEK_SET);

    // 현재 파일 포인터 위치 출력
    long pos = ftell(fp);
    printf("현재 파일 위치: %ld\n", pos);

    fclose(fp);
    return 0;
}

3. ftell 함수

ftell 함수는 현재 파일 포인터의 위치를 반환합니다.

사용법

long ftell(FILE *stream);
  • stream: 파일 포인터
  • 반환값: 현재 위치(바이트 단위), 실패 시 -1

예제: 파일의 현재 위치 확인

#include <stdio.h>

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

    printf("초기 위치: %ld\n", ftell(fp));
    fseek(fp, 20, SEEK_SET);
    printf("20바이트 이동 후 위치: %ld\n", ftell(fp));

    fclose(fp);
    return 0;
}

4. rewind 함수

rewind 함수는 파일 포인터를 파일의 처음으로 되돌립니다.

사용법

void rewind(FILE *stream);
  • stream: 파일 포인터
  • 반환값 없음

예제: 파일 처음으로 이동하기

#include <stdio.h>

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

    fseek(fp, 50, SEEK_SET);
    printf("50바이트 이동 후 위치: %ld\n", ftell(fp));

    rewind(fp);
    printf("rewind 후 위치: %ld\n", ftell(fp));

    fclose(fp);
    return 0;
}

5. 실전 예제: 특정 위치에서 데이터 읽기

아래 예제는 fseekftell을 이용하여 파일의 특정 위치에서 데이터를 읽는 방법을 보여줍니다.

#include <stdio.h>

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

    // 파일 크기 확인
    fseek(fp, 0, SEEK_END);
    long file_size = ftell(fp);
    printf("파일 크기: %ld 바이트\n", file_size);

    // 파일의 중간 위치로 이동하여 데이터 읽기
    fseek(fp, file_size / 2, SEEK_SET);
    char buffer[20];
    fread(buffer, sizeof(char), 19, fp);
    buffer[19] = '\0';
    printf("중간에서 읽은 데이터: %s\n", buffer);

    fclose(fp);
    return 0;
}

6. 마무리

fseek, ftell, rewind 함수는 파일 내에서 원하는 위치로 이동하고 데이터를 읽거나 쓸 때 필수적인 함수입니다. 파일을 다룰 때 파일 포인터를 적절히 조작하면 효율적인 파일 입출력을 구현할 수 있습니다.

이번 글에서는 기본적인 개념과 예제를 살펴보았으며, 이를 바탕으로 다양한 파일 조작을 시도해보길 바랍니다!

반응형