Linux

[Linux] 파일 오프셋 - lseek

개발로 먹고 살자 2022. 7. 27. 16:21

파일 오프셋 - lseek 

#include<sys/types.h>
off_t lseek(int fd, off_t offset, int whence);
  fd - 파일 기술자
  offset - 이동할 오프셋 위치
  whence - 오프셋의 기준 위치

 

whence

  SEEK_SET - 파일의 시작, SEEK_CUR - 현재 위치, SEEK_END - 파일의 끝

 

 

현재 위치 구하기

cur = lseek(fd, 0, SEEK_CUR)

 

반대방향으로 이동하려면 값을 음수로 지정
실행에 성공하면 새로운 오프셋을 리턴, 실패하면 -1 

 

Exercise -  파일의 위치 출력

#include<unistd.h>
#include<fcntl.h>
#include<stdio.h>

int main(int argc, char* argv[]) {

	int fd;
	char buf[256];
	int start, n;

	fd = open(argv[1], O_RDONLY, 0644);

	if(fd == -1) {
		printf("open error");
	}

	start = lseek(fd, 0, SEEK_CUR);
	n = read(fd, buf, 255);
	buf[n] = '\0';
	printf("start = %d, n = %d, buf = %s", start, n, buf);

	start = lseek(fd, 6, SEEK_SET);
	n = read(fd, buf, 255);
	buf[n] = '\0';
	printf("start = %d, n = %d, buf = %s", start, n, buf);

	return 0;
}

 

linux system programming 이 적혀 있는 a.txt 파일을 하나 만들었다.

 

lseek으로 현재 위치를 start에 담고 파일을 읽었다.

시작은 0이고 n은 읽은 개수이다. buf에는 읽은 파일명이 담겨 있다.

파일을 끝까지 다 읽었기 때문에 현재 파일 포인터는 맨 뒤를 가리키고 있다.

 

그렇기 때문에 SEEK_SET 을 통해  파일의 시작 위치를 바꿔주었다.

이번에는 처음인 0부터 시작하는 것이 아닌 6번째 위치부터 시작하여 읽었다.

0번째 인덱스부터 시작하여 linux(공백)을 건너뛰고 s부터 시작하는 것이다.

 

실행 결과

 

 

lseek을 사용하여 파일의 크기를 찾을 수 있다.

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>

int main(int argc, char* argv[]) {

	int fd;
    
    fd = open(argv[1], O_RDONLY, 0644);
    
    if(fd == -1) {
    	perror("open error");
    }
    
    int fileSize = lseek(fd, 0, SEEK_END);
    
    printf("파일의 크기 : %d\n", fileSize);

	return 0;
}

 

a.txt 은 linux system programming이 작성되어 있다.

SEEK_END 를 통해 파일의 맨 끝으로 간 뒤 현재 파일 포인터 값을 받았다.

 

실행 결과