우리가 파일에서 데이터를 읽을 때 일정부분을 읽어오고 다음에 또다시 읽어오면 읽지 않은 부분부터 알아서 읽어왔습니다. 이것은 FILE 구조체의 멤버에는 파일 위치 지시자란것이 있기 때문인데요, 이 파일위치 지시자는 fgets나 fputs 등의 데이터를 읽거나 쓰는 함수가 호출될때마다 그 값을 참조해서 현재 위치를 저장해둡니다.
int fseek(FILE * stream, long offset, int wherefrom);
//전달인자 1 : 파일에 연결된 스트림
//전달인자 2 : 파일위치 지시자를 얼마만큼 이동시킬지 결정하는 byte수
//전달인자 3 : 파일위치지시자가 이동되기 전에 이동을 시작할 위치
파일위치지시자의 이동 성공 시 0, 실패 시 0이 아닌 값 반환
파일위치 지시자의 3번째 전달인자인 wherefrom에 전달할 수 있는 상수가 몇 개 정의되어있는데 다음과 같습니다.
wherefrom | 의미 |
---|---|
SEEK_SET | 파일의 처음 |
SEEK_CUR | 파일의 현재 위치 |
SEEK_END | 파일의 끝 |
그림으로 예를 들어서 설명해보겠습니다.
첫 번째 fseek함수는 파일구조체 포인터변수 f0가 가르키는 파일을 SEEK_SET(파일의 처음)부터 뒤로 두 칸 이동시켜라 라는 의미에요. 나머지도 그림을 보며 해석해보시면 충분히 이해가 되실겁니다.
#include <stdio.h>
int main(void)
{
FILE * f0 = fopen(“test.txt”, “wt”);
FILE * f1 = fopen(“test.txt”, “rt”);
fputs(“123456789”, f0);
fclose(f0);
fseek(f1, 3, SEEK_SET); //1->4
printf(“%c”, fgetc(f1)); //4읽어서 출력하고 5로 이동
fseek(f1, 1, SEEK_CUR);//5->6
printf(“%c”, fgetc(f1));//6 읽어서 출력하고 7로 이동
fseek(f1, -3, SEEK_CUR);//7->4
printf(“%c”, fgetc(f1));//4 읽어서 출력하고 5로 이동
fclose(f1);
return 0;
}
실행결과
464
계속하려면 아무 키나 누르십시오 . . .
주석에 설명을 달아놓았으므로 추가설명은 드리지 않겠습니다. fseek함수를 사용해서 위치를 설정하고 앞이나 뒤로 이동할 수 있다는 사실과 문자 입출력함수를 사용해서 파일의 데이터를 읽으면 위치 지시자는 읽은 만큼 뒤로 이동한다는 사실이 중요합니다.
그리고 현재 파일 위치 지시자를 알려주는 함수가 있습니다.
long ftell(FILE * stream); //stream으로 연결된 파일의 현재 위치 반환
#include <stdio.h>
int main(void)
{
FILE * f0 = fopen(“test.txt”, “wt”);
FILE * f1 = fopen(“test.txt”, “rt”);
int cur_pos;
fputs(“123456789”, f0);
fclose(f0);
fseek(f1, 0, SEEK_END); //9
cur_pos = ftell(f1);
printf(“%d\n”, cur_pos);
fseek(f1, -3, SEEK_CUR); // 6
cur_pos = ftell(f1);
printf(“%d\n”, cur_pos);
fclose(f1);
return 0;
}
실행결과
9
6
계속하려면 아무 키나 누르십시오 . . .
test라는 .txt 파일을 만들고 123456789의 내용을 썼습니다. 처음 fseek함수에 의해 파일의 끝인 9로 이동시켜서 ftell함수로 현재위치를 cur_pos에 담아서 출력해봤는데 정상적으로 9가 나왔습니다. 또다시 fseek함수로 현재위치(9)에서 앞으로 3만큼이동시켜 6을 가르키게 만들고 동일한 방식으로 ftell함수를 이용해서 cur_pos에 현재위치를 담고 출력했는데 정상적으로 6이 나왔습니다.
파일위치 지시자는 우리가 현재 파일에서 어디까지 읽어들였는지, 혹은 썼는지 확인할 때 유용하게 사용할 수 있습니다.
'프로그래밍 언어 > C' 카테고리의 다른 글
(C언어) 47 - C 파일의 분할과 헤더파일 생성 (0) | 2020.05.14 |
---|---|
(C언어) 46 - 공용체(union) (0) | 2020.05.14 |
(C언어) 44 - 파일 입출력(2) - text, binary 입출력 함수들 (0) | 2020.05.14 |
(C언어) 43 - 파일 입출력(1) - 스트림 생성과 개방모드 (0) | 2020.05.14 |
(C언어) 42 - 선행처리 - 매크로 (0) | 2020.05.14 |