Namespaces
Variants

fseek

From cppreference.net
< c ‎ | io
헤더 파일에 정의됨 <stdio.h>
int fseek ( FILE * stream, long offset, int origin ) ;
#define SEEK_SET    /* unspecified */

#define SEEK_CUR    /* unspecified */

#define SEEK_END    /* unspecified */

파일 스트림 stream 의 파일 위치 표시자를 offset 이 가리키는 값으로 설정합니다.

만약 stream 이 바이너리 모드로 열려 있다면, 새로운 위치는 origin SEEK_SET 인 경우 파일 시작부터 정확히 offset 바이트, origin SEEK_CUR 인 경우 현재 파일 위치부터, origin SEEK_END 인 경우 파일 끝부터 측정됩니다. 바이너리 스트림은 특히 추가적인 널 바이트가 출력되는 경우 SEEK_END 를 지원할 필요가 없습니다.

만약 stream 이 텍스트 모드로 열려 있다면, offset 에 대해 지원되는 유일한 값들은 0(이는 어떤 origin 과도 함께 작동함)과 동일한 파일과 연관된 스트림에서 이전에 호출된 ftell 이 반환한 값(이는 origin SEEK_SET 인 경우에만 작동함)입니다.

만약 stream 이 와이드 지향(wide-oriented)이라면, 텍스트 스트림과 바이너리 스트림의 제약 사항이 모두 적용됩니다 ( ftell 의 결과는 SEEK_SET 과 함께 사용할 수 있으며, 제로 오프셋은 SEEK_SET SEEK_CUR 에서 허용되지만, SEEK_END 에서는 허용되지 않습니다 ).

파일 위치 지시자를 변경하는 것 외에도, fseek ungetc 의 효과를 취소하고, 해당되는 경우 파일 끝(end-of-file) 상태를 지웁니다.

읽기 또는 쓰기 오류가 발생하면, 스트림의 오류 표시자( ferror )가 설정되고 파일 위치는 영향을 받지 않습니다.

목차

매개변수

stream - 수정할 파일 스트림
offset - origin 기준으로 위치를 이동할 문자 수
origin - offset 이 추가되는 기준 위치. 다음 값 중 하나를 가질 수 있음: SEEK_SET , SEEK_CUR , SEEK_END

반환값

0 성공 시 0, 그렇지 않으면 0이 아닌 값.

참고 사항

넓은 스트림에서 끝이 아닌 위치로 탐색한 후, 다음 출력 함수 호출은 파일의 나머지 부분을 정의되지 않은 상태로 만들 수 있습니다. 예를 들어, 다른 길이의 멀티바이트 시퀀스를 출력함으로써 발생할 수 있습니다.

텍스트 스트림의 경우, offset 의 유효한 값은 0 (어떤 origin 에도 적용 가능)과 이전 ftell 호출에서 반환된 값( SEEK_SET 에만 적용 가능)뿐입니다.

POSIX는 파일의 기존 끝을 넘어서는 탐색을 허용합니다. 이러한 탐색 이후 출력이 수행되면, 갭에서의 모든 읽기 작업은 제로 바이트를 반환합니다. 파일 시스템에서 지원하는 경우, 이는 스파스 파일 을 생성합니다.

POSIX는 또한 fseek 가 먼저 fflush 를 수행하도록 요구합니다 (쓰여지지 않은 데이터가 있을 경우, 하지만 shift state가 복원되는지 여부는 구현에 따라 정의됩니다).

POSIX는 fseek 이 오류 시 - 1 을 반환하고, errno 를 해당 오류로 설정해야 한다고 명시합니다.

Windows에서는, _fseeki64 함수를 사용하여 2GiB보다 큰 파일을 처리할 수 있습니다.

예제

fseek 오류 검사와 함께:

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    // double 값 배열 준비
    #define SIZE 5
    double A[SIZE] = {1.0, 2.0, 3.0, 4.0, 5.0};
    // 배열을 파일에 기록
    FILE * fp = fopen("test.bin", "wb");
    fwrite(A, sizeof(double), SIZE, fp);
    fclose (fp);
    // double 값을 배열 B로 읽어오기
    double B[SIZE];
    fp = fopen("test.bin", "rb");
    // 파일 위치 지시자를 세 번째 double 값 앞으로 설정
    if (fseek(fp, sizeof(double) * 2L, SEEK_SET) != 0)
    {
        fprintf(stderr, "fseek() failed in file %s at line # %d\n",
                __FILE__, __LINE__ - 2);
        fclose(fp);
        return EXIT_FAILURE;
    }
    int ret_code = fread(B, sizeof(double), 1, fp); // 하나의 double 값 읽기
    printf("ret_code == %d\n", ret_code);           // 읽은 값의 개수 출력
    printf("B[0] == %.1f\n", B[0]);                 // 하나의 값 출력
    fclose(fp);
    return EXIT_SUCCESS;
}

가능한 출력:

ret_code == 1
B[0] == 3.0

참조문헌

  • C23 표준 (ISO/IEC 9899:2024):
  • 7.23.9.2 fseek 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.21.9.2 fseek 함수 (p: 245)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.21.9.2 fseek 함수 (p: 336-337)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.19.9.2 fseek 함수 (p: 302-303)
  • C89/C90 표준 (ISO/IEC 9899:1990):
  • 4.9.9.2 fseek 함수

참고 항목

파일 위치 표시자를 파일의 특정 위치로 이동
(함수)
파일 위치 표시자를 얻음
(함수)
현재 파일 위치 표시자를 반환
(함수)
파일 위치 표시자를 파일의 시작 부분으로 이동
(함수)