프로그래밍 기술/리눅스(Unix) 시스템 프로그래밍

표준 입출력 - 파일 스트림 작업 위치 변경 및 확인, fseek, ftell, rewind

언제나휴일 2017. 8. 3. 15:32
반응형

 파일 입출력 작업 중에 프로그램 방식으로 작업 위치를 변경하거나 확인할 수 있는 함수를 제공하고 있습니다. 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 실행 화면

[그림 5.13] ex_fseek 실행 화면


반응형