C언어/stdio.h

[C언어] fseek 함수 (stdio.h, 파일 stream 오프셋 변경)

아무일도없었다 2022. 8. 31. 23:44

사용범위

Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수

기능

C언어 표준 함수로 파일 stream 의 오프셋을 변경한다.

헤더

#include <stdio.h>

※ fseek 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※


함수

int fseek(FILE* file, long offset, int origin);

파라미터

  • FILE* file
    • fopen 함수를 통해 열린 file stream을 입력한다.
  • long offset
    • origin 에 설정된 위치를 기준으로 이동할 file stream의 오프셋을 입력한다.
  • int origin
    • file stream 이 이동할 기준점을 아래에 정의된 매크로를 사용하여 입력한다.

 

정의된 매크로 의미
SEEK_SET 0 파일의 시작 위치
SEEK_CUR 1 파일 stream 의 현재 위치
SEEK_END 2 파일의 마지막 위치

 


반환값

성공시   0을 반환한다.
실패시   0이 아닌 값을 반환한다.

잡학지식

fseek 함수는 파일 stream 내부의 포인터를 offset 과 origin 이라는 값을 사용하여 상대적으로 이동시킨다.

따라서 현재 파일의 끝을 넘어가거나 잘못된 위치로의 이동은 심각한 오류를 발생할 수 있다.

 

fseek 함수 사용시 이러한 위험을 충분히 인지하고 fseek 을 사용하는 DEEP(?) 한 로직 구현은 피하는것을 권장한다.


 

< test.txt >

abcdefghijklmnopqrstuvwxyz

 

<소스 코드>

#include <stdio.h>

#define MAX_BUF_SIZE 128

void print_file_data(FILE *fp, size_t size)
{
    static int count = 0;
    char buffer[MAX_BUF_SIZE] = {0,};

    fread(buffer, sizeof(char), size, fp);

    printf("buffer(%d):[%s]\n", ++count, buffer);
}

int main() {
    FILE *fp;
    int ret;

    fp = fopen("test.txt", "r");
    if (fp != NULL) {
    	// fopen "r" 의 현재 위치에서 파일 데이터 확인
        print_file_data(fp, 3);

        // 파일의 시작위치(SEEK_SET) 에서 offset 5만큼 떨어진 곳으로 파일 포인터를 이동
        ret = fseek(fp, 5, SEEK_SET);
        if (ret == 0) {
            print_file_data(fp, 3);
        } else {
            // fseek 함수 실패
        }

        // 파일의 현재위치(SEEK_CUR) 에서 offset -2 만큼 떨어진 곳으로 파일 포인터를 이동
        ret = fseek(fp, -2, SEEK_CUR);
        if (ret == 0) {
            print_file_data(fp, 3);
        } else {
            // fseek 함수 실패
        }

        // 파일의 마지막 위치(SEEK_END) 에서 offset -10 만큼 떨어진 곳으로 파일 포인터를 이동
        ret = fseek(fp, -10, SEEK_END);
        if (ret == 0) {
            print_file_data(fp, 3);
        } else {
            // fseek 함수 실패
        }

        fclose(fp);
    }

    return 0;
}

 

※ 실행 결과

buffer(1):[abc]
buffer(2):[fgh]
buffer(3):[ghi]
buffer(4):[qrs]

 

반응형