`fsetpos` — 저장해 둔 위치로 파일 위치 지시자를 되돌리는 함수
fsetpos — 저장해 둔 위치로 파일 위치 지시자를 되돌리는 함수
fgetpos로 어딘가의 위치를 기억해 두고, 나중에 다시 그 자리로 돌아가고 싶을 때가 있어요. 그럴 때 쓰는 게 fsetpos예요. fseek이 "시작 기준 몇 바이트" 식으로 이동한다면, fsetpos은 이전에 fgetpos로 저장해 둔 fpos_t 값을 그대로 복원하는 방식입니다.
본문
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 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.