메뉴

문서정보

목차

lseek

읽기및 쓰기를 위해서 파일의 위치를 재지정

사용법

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fildes, off_t offset, int whence);;

설명

lseek()는 열린 파일 지정자 fildes로 부터 offset만큼 위치를 변경한다. 위치 변경시 기준점을 정할 수 있는데 whence를 이용해서 지정할 수 있다.

파일의 처음을 기준으로 offset을 계산한다. 파일의 현재 위치를 기준으로 offset을 계산한다. 파일의 마지막을 기준으로 offset을 계산한다.

실수로 파일의 마지막을 초과해서 lseek를 사용했을 경우 lseek에서 리턴을 하지는 않지만 write()혹은 read()에서 에러를 발생하게 되므로 주의 해야 한다.

반환값

성공했을 경우 파일의 시작으로 부터 떨어진 byte만큼의 offset을 리턴한다. 실패했을 경우 -1을 리턴한다.

에러

Fildes가 열린 파일 지정자가 아니다. Fildes가 파이프, 소켓 혹은 FIFO이다. Whence가 유효한 값이 아니다.

예제

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    int fd;
    int i, buf;
    fd = open("num.dat", O_RDWR|O_CREAT);
    if (fd < 0)
    {
        perror("error : ");
        exit(0);
    }
    for (i = 1000; i < 1010; i++)
    {
        write(fd, (void *)&i, sizeof(i));
    }
    // 파일의 처음으로 이동한 다음 데이터를 읽는다.
    lseek(fd, 0, SEEK_SET);
    read(fd, (void *)&buf, sizeof(i));
    printf("%d\n", buf);

    // 파일의 처음이로 이동한 다음 4번째 입력된 숫자를
    // 읽는다.
    lseek(fd, 4*sizeof(i), SEEK_SET);
    read(fd, (void *)&buf, sizeof(i));
    printf("%d\n", buf);
}

아래와 같은 방법으로 쓰기버퍼를 비울 수도 있다.
write(fd, buf, strlen(buf));
lseek(wfd, 0, SEEK_SET);

참고문헌

  1. seek를 이용한 파일내 위치이동