fseek
|
헤더 파일에 정의됨
<stdio.h>
|
||
|
int
fseek
(
FILE
*
stream,
long
offset,
int
origin
)
;
|
||
|
#define SEEK_SET /* unspecified */
#define SEEK_CUR /* 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 함수
참고 항목
|
파일 위치 표시자를 파일의 특정 위치로 이동
(함수) |
|
|
파일 위치 표시자를 얻음
(함수) |
|
|
현재 파일 위치 표시자를 반환
(함수) |
|
|
파일 위치 표시자를 파일의 시작 부분으로 이동
(함수) |
|
|
C++ documentation
for
fseek
|
|