설명

파일의 읽기/쓰기 위치를 파일의 처음 위치로 초기화합니다.

파일의 위치는 기준 옵션에 따라 앞으로 또는 뒤로 읽기/쓰기 위치로 건너 띕니다.

 

whence 설명

SEEK_SET

파일의 시작
SEEK_CUR 현재 읽기/쓰기 포인터 위치
SEEK_END 파일의 끝

 

건너 띈다는 말씀은 인수로 받은 숫자의 위치로 이동한다는 뜻이 아니라 건너 띄듯이 count 한다는 뜻입니다. 아래의 그림을 참고하여 주십시오.

 

* 그림은 fseek에 사용된 그림입니다. 그러나 whence가 의미하는 내용은 같으므로 그대로 사용되었습니다.
fseek()는 FILE *fp;를 사용했고 lseek()는 int fd를 사용한 것에 유의하세요.

 

또한 fseek()와는 달리 이동 후의 읽기/쓰기 포인터를 반환하므로 SEEK_END를 이용하여 파일 크기를 구할 수 있습니다. 즉,

 

      sz_file = lseek( fd, 0, SEEK_END);

 

SEEK_END에서 0 위치에 해당하는 읽기 쓰기 포인터의 위치가 곧 파일의 끝이므로 파일 크기를 구할 수 있습니다.

헤더 unistd.h
형태 off_t lseek(int fildes, off_t offset, int whence);
인수 int fildes 파일 디스크립터
  off_t offset 이동할 바이트 수
  int whence 시작 시점
반환 off_t 변경된 읽기/쓰기 포인터
예제
#include <stdio.h>         // puts()
#include <string.h>        // strlen() memset()
#include <fcntl.h>         // O_WRONLY
#include <unistd.h>        // write(), close()

#define  BUFF_SIZE   1024

int main()
{
   int   fd;
   char  buff[BUFF_SIZE];
   off_t sz_file;

   fd = open( "./test.txt", O_RDONLY);

   memset( buff, '\0', BUFF_SIZE);
   lseek( fd, 10, SEEK_SET);              // 파일의 시작에서 10번을 건너 띈다.
   read( fd, buff, BUFF_SIZE);
   puts( buff);

   memset( buff, '\0', BUFF_SIZE);
   lseek( fd,  5, SEEK_SET);              // 파일의 시작에서 5번을 건너 띈다.
   lseek( fd,  5, SEEK_CUR);              // 현재 위치에서 다시 5번을 건너 띈다.
   read( fd, buff, BUFF_SIZE);
   puts( buff);

   memset( buff, '\0', BUFF_SIZE);
   lseek( fd,  -5, SEEK_END);             // 파일의 끝에서 앞으로 5번을 건너 띈다.
   read( fd, buff, BUFF_SIZE);
   puts( buff);

   sz_file  = lseek( fd,  0, SEEK_END);      // 파일의 끝 위치를 반환
   printf( "file size = %d\n", (int)sz_file);

   close( fd);

   return 0;
}

test.txt 파일에 16진수 문자, 0부터 f 까지 입력되어 있을 때 실행 결과입니다.

0123456789abcdef

]$ ./a.out abcdef abcdef bcdef file size = 16 ]$