파일 입출력 작업 중에 프로그램 방식으로 작업 위치를 변경하거나 확인할 수 있는 함수를 제공하고 있습니다. fseek 함수는 작업 위치를 변경할 때 사용하는 함수이며 ftell 함수는 현재 작업 위치를 확인하는 함수입니다. 또한 작업 위치를 시작 위치로 이동하는 rewind 함수를 제공하고 있어요.
#include <stdio.h >
long ftell(FILE *fp);
반환 값: 실패 시 -1, 성공 시 offset
int fseek(FILE *fp, long offset, int whence);
반환 값: 성공 시 0
whence:
SEEK_SET – 시작 위치
SEEK_CUR – 현재 위치
SEEK_END – 끝 위치
void rewind(FILE *fp);
다음은 고정 길이의 회원 데이터 여러 개를 보관하고 있는 파일에서 원하는 순서를 입력받아 회원 정보를 조회하는 예제입니다.
/********************************************************************** * ex_fseek.c * * exmple source – test binary I/O * **********************************************************************/ #include <stdio.h> #define MAX_NAME_LEN 20 typedef struct _Member Member; struct _Member { char name[MAX_NAME_LEN+1]; int age; int num; }; void Write(); void Search(); int main() { Write(); Search(); return 0; } void Write() { Member base[4]= { {"홍길동",20,3}, {"강감찬",30,4},{"김유신",70,1},{"이순신",35,2} }; FILE *fp= fopen("memdata","wb"); fwrite(base, sizeof(Member),4, fp); fclose(fp); } void Search() { FILE *fp= fopen("memdata","rb"); fseek(fp, 0, SEEK_END); int mcnt = ftell(fp)/sizeof(Member); rewind(fp); int nth = 0; printf("원하는 순번(1~%d):",mcnt); scanf("%d",&nth); if((nth<=0) || (nth > mcnt)) { printf("잘못 입력하였습니다.\n"); return; } Member member; fread(&member, sizeof(Member),1, fp); fclose(fp); printf("이름:%s 번호:%d 나이:%d\n", member.name, member.num, member.age); }
FILE *fp= fopen(“memdata”,”r”);
fseek(fp, 0, SEEK_END);
int mcnt = ftell(fp)/sizeof(Member);
fseek함수로 SEEK_END에서 offset 0로 작업 위치를 설정하면 파일의 끝으로 이동합니다. 그리고 ftell 함수를 호출한 결과를 회원 구조체 크기로 나누면 파일에 몇 명의 회원 데이터가 파일에 있는지 확인할 수 있어요. 참고로 여기에서 반환한 ftell 함수의 반환 값이 파일의 크기입니다.