[리눅스 시스템 프로그래밍] 5.10 파일 스트림 작업 위치 변경 및 확인, fseek, ftell, rewind

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