파일 입출력 작업 중에 프로그램 방식으로 작업 위치를 변경하거나 확인할 수 있는 함수를 제공하고 있습니다. 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 함수의 반환 값이 파일의 크기입니다.
[그림 5.13] ex_fseek 실행 화면
'프로그래밍 기술 > 리눅스(Unix) 시스템 프로그래밍' 카테고리의 다른 글
표준 입출력 - 바이너리 모드 입출력 함수, fread, fwrite (0) | 2017.08.03 |
---|---|
표준 입출력 - 텍스트 모드 입출력 함수들 (0) | 2017.08.01 |
표준 입출력 - 텍스트 모드와 바이너리 모드 입출력 (0) | 2017.08.01 |
표준 입출력 - freopen, fdopen (2) | 2017.07.28 |
표준 입출력 - fopen, fclose (0) | 2017.07.28 |
RAW 입출력과 표준 입출력의 성능 비교 (0) | 2017.07.27 |
표준 입출력 - FILE 구조체 (0) | 2017.07.27 |
표준 입출력 - 버퍼 및 버퍼링 정책 설정 (0) | 2017.07.27 |
파일입출력 - 버퍼링 (0) | 2017.07.25 |
표준 입출력 라이브러리 (0) | 2017.07.25 |