`fsetpos` — 저장해 둔 위치로 파일 위치 지시자를 되돌리는 함수

fsetpos — 저장해 둔 위치로 파일 위치 지시자를 되돌리는 함수

fgetpos로 어딘가의 위치를 기억해 두고, 나중에 다시 그 자리로 돌아가고 싶을 때가 있어요. 그럴 때 쓰는 게 fsetpos예요. fseek이 "시작 기준 몇 바이트" 식으로 이동한다면, fsetpos은 이전에 fgetpos로 저장해 둔 fpos_t 값을 그대로 복원하는 방식입니다.

출처: cppreference — fsetpos

본문

fsetpos은 파일 스트림 stream의 파일 위치 지시자와, 있다면 멀티바이트 파싱 상태(multibyte parsing state)를 pos가 가리키는 값에 따라 설정해요.

문법

#include <stdio.h>

int fsetpos( FILE *stream, const fpos_t *pos );

설명

새로운 파싱 상태와 위치를 세우는 것에 더해, 이 함수를 호출하면 ungetc의 효과가 되돌려지고 설정되어 있다면 파일 끝(end-of-file) 상태도 지워집니다. 읽기나 쓰기 오류가 발생하면 스트림의 오류 지시자(ferror)가 설정돼요.

매개변수

매개변수 설명
stream 수정할 파일 스트림
pos 파일 위치 지시자의 새 값으로 사용할 fpos_t 객체를 가리키는 포인터

반환값

성공하면 0, 실패하면 0이 아닌 값을 돌려줘요.

주의

와이드 스트림에서 끝이 아닌 위치로 이동한 뒤에는, 다음에 어떤 출력 함수를 호출해도 파일의 나머지 부분이 정의되지 않은 상태가 될 수 있어요. 예를 들어 다른 길이의 멀티바이트 시퀀스를 출력하면서 그렇게 될 수 있습니다.

예시

오류 검사를 곁들인 fsetpos 예시예요. 시작 위치를 fgetpos로 기억해 두고, 값을 하나 읽은 뒤 다시 처음으로 되돌아가서 첫 값을 다시 읽습니다.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    // Prepare an array of FP (floating-point) values.
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};

    // Write array to a file.
    FILE *fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose(fp);

    // Read the FP values into array B.
    double B[SIZE];
    fp = fopen("test.bin", "rb");

    fpos_t pos;
    if (fgetpos(fp, &pos))                        // current position: start of file
    {
        perror("fgetpos()");
        fprintf(stderr, "fgetpos() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 3);
        exit(EXIT_FAILURE);
    }

    int ret_code = fread(B, sizeof(double), 1, fp); // read one FP value
    // current position: after reading one f-p value
    printf("%.1f; read count = %d\n", B[0], ret_code); // print one FP value and ret_code

    if (fsetpos(fp, &pos))  // reset current position to start of file
    {
        if (ferror(fp))
        {
            perror("fsetpos()");
            fprintf(stderr, "fsetpos() failed in file %s at line # %d\n",
                    __FILE__, __LINE__ - 5);
            exit(EXIT_FAILURE);
        }
    }

    ret_code = fread(B, sizeof(double), 1, fp); // reread first FP value
    printf("%.1f; read count = %d\n", B[0], ret_code); // print one FP value and ret_code

    fclose(fp);
    return EXIT_SUCCESS;
}

가능한 출력:

1.0; read count = 1
1.0; read count = 1

fread 후 위치가 아니라 fsetpos로 되돌린 시작 위치에서 다시 읽으니, 두 번째 출력도 같은 값 1.0이 나오는 걸 확인할 수 있어요. 위치 복원 과정에서 오류가 났는지, 그래서 오류 지시자가 설정됐는지를 ferror로 검사하는 것도 눈여겨볼 만합니다.

더 알아보기

  • fgetpos — 파일 위치 지시자를 얻어요.
  • ftell — 현재 파일 위치 지시자를 돌려줘요.
  • fseek — 파일 위치 지시자를 파일의 특정 위치로 이동해요.
  • cppreference의 fsetpos 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.