사용범위
Windows, Unix 등 모든 OS에서 사용가능한 표준 API 함수
기능
C언어 표준 함수로 파일 stream 의 오프셋을 변경한다.
헤더
#include <stdio.h>
※ fseek 함수 사용시 stdio.h 파일을 include 하지 않는다면 컴파일시 error 발생 ※
함수
int fseek(FILE* file, long offset, int origin);
파라미터
- FILE* file
- fopen 함수를 통해 열린 file stream을 입력한다.
- fopen 함수를 통해 열린 file stream을 입력한다.
- long offset
- origin 에 설정된 위치를 기준으로 이동할 file stream의 오프셋을 입력한다.
- int origin
- file stream 이 이동할 기준점을 아래에 정의된 매크로를 사용하여 입력한다.
정의된 매크로 | 값 | 의미 |
SEEK_SET | 0 | 파일의 시작 위치 |
SEEK_CUR | 1 | 파일 stream 의 현재 위치 |
SEEK_END | 2 | 파일의 마지막 위치 |
반환값
성공시 0을 반환한다.
실패시 0이 아닌 값을 반환한다.
잡학지식
fseek 함수는 파일 stream 내부의 포인터를 offset 과 origin 이라는 값을 사용하여 상대적으로 이동시킨다.
따라서 현재 파일의 끝을 넘어가거나 잘못된 위치로의 이동은 심각한 오류를 발생할 수 있다.
fseek 함수 사용시 이러한 위험을 충분히 인지하고 fseek 을 사용하는 DEEP(?) 한 로직 구현은 피하는것을 권장한다.
< test.txt >
abcdefghijklmnopqrstuvwxyz
<소스 코드>
#include <stdio.h>
#define MAX_BUF_SIZE 128
void print_file_data(FILE *fp, size_t size)
{
static int count = 0;
char buffer[MAX_BUF_SIZE] = {0,};
fread(buffer, sizeof(char), size, fp);
printf("buffer(%d):[%s]\n", ++count, buffer);
}
int main() {
FILE *fp;
int ret;
fp = fopen("test.txt", "r");
if (fp != NULL) {
// fopen "r" 의 현재 위치에서 파일 데이터 확인
print_file_data(fp, 3);
// 파일의 시작위치(SEEK_SET) 에서 offset 5만큼 떨어진 곳으로 파일 포인터를 이동
ret = fseek(fp, 5, SEEK_SET);
if (ret == 0) {
print_file_data(fp, 3);
} else {
// fseek 함수 실패
}
// 파일의 현재위치(SEEK_CUR) 에서 offset -2 만큼 떨어진 곳으로 파일 포인터를 이동
ret = fseek(fp, -2, SEEK_CUR);
if (ret == 0) {
print_file_data(fp, 3);
} else {
// fseek 함수 실패
}
// 파일의 마지막 위치(SEEK_END) 에서 offset -10 만큼 떨어진 곳으로 파일 포인터를 이동
ret = fseek(fp, -10, SEEK_END);
if (ret == 0) {
print_file_data(fp, 3);
} else {
// fseek 함수 실패
}
fclose(fp);
}
return 0;
}
※ 실행 결과
buffer(1):[abc]
buffer(2):[fgh]
buffer(3):[ghi]
buffer(4):[qrs]
반응형
'C언어 > stdio.h' 카테고리의 다른 글
[C언어] feof 함수 (stdio.h) (0) | 2022.09.04 |
---|---|
[C언어] ftell 함수 (stdio.h, 파일 크기, stream 위치 구하기) (0) | 2022.09.02 |
[C언어] freopen 함수 (stdio.h) (0) | 2022.08.26 |
[C언어] remove 함수 (stdio.h) (0) | 2022.08.23 |
[C언어] fputc 함수 (stdio.h) (0) | 2022.08.17 |