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 를 통해 파일의 맨 끝으로 간 뒤 현재 파일 포인터 값을 받았다.