`fgetpos` 함수

fgetpos 함수 (fgetpos)

파일에 저장된 값을 다시 읽으려면 어디까지 읽었는지 위치를 기억해 두어야 할 때가 있어요. fgetpos는 파일 위치 표시자(file position indicator)와 파싱 상태를 fpos_t 객체에 저장해 두는 함수예요. 저장한 값을 사용해 나중에 다시 그 위치로 돌아갈 수 있어요.

출처: cppreference

본문

함수 원형

<stdio.h>에 정의돼 있어요.

int fgetpos( FILE* stream, fpos_t* pos );                    // (until C99)
int fgetpos( FILE* restrict stream, fpos_t* restrict pos ); // (since C99)

설명 (Explanation)

파일 스트림 stream의 파일 위치 표시자와 현재 파싱 상태(있다면)를 얻어 pos가 가리키는 객체에 저장해요. 저장된 값은 오직 fsetpos의 입력으로만 의미가 있어요.

매개변수 (Parameters)

  • stream — 조사할 파일 스트림
  • pos — 파일 위치 표시자를 저장할 fpos_t 객체를 가리키는 포인터

반환값 (Return value)

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

예제 (Example)

이진 파일을 열고, fgetpos로 파일 시작 위치를 기억해 두었다가 fsetpos로 되돌아가는 예시예요. 오류 처리까지 함께 보여 줘요.

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

int main(void)
{
    // prepare a file holding 4 values of type double
    enum {SIZE = 4};
    FILE* fp = fopen("test.bin", "wb");
    assert(fp);
    int rc = fwrite((double[SIZE]){1.1, 2.2, 3.3, 4.4}, sizeof(double), SIZE, fp);
    assert(rc == SIZE);
    fclose(fp);

    // demo using fsetpos to return to the beginning of a file
    fp = fopen("test.bin", "rb");
    fpos_t pos;
    fgetpos(fp, &pos);               // store start of file in pos
    double d;
    rc = fread(&d, sizeof d, 1, fp); // read the first double
    assert(rc == 1);
    printf("First value in the file: %.1f\n", d);
    fsetpos(fp,&pos);                // move file position back to the start of the file
    rc = fread(&d, sizeof d, 1, fp); // read the first double again
    assert(rc == 1);
    printf("First value in the file again: %.1f\n", d);
    fclose(fp);

    // demo error handling
    rc = fsetpos(stdin, &pos);
    if (rc)
        perror("could not fsetpos stdin");
}

출력:

First value in the file: 1.1
First value in the file again: 1.1
could not fsetpos stdin: Illegal seek

fsetposstdin에 호출해 보면, 오류가 나면 0이 아닌 값을 돌려주고 perror로 메시지를 출력하는 흐름을 볼 수 있어요.

같이 보기 (See also)

  • ftell — 현재 파일 위치 표시자 반환
  • fseek — 파일 위치 표시자를 특정 위치로 이동
  • fsetpos — 파일 위치 표시자를 특정 위치로 이동