개요
이 튜토리얼에서는 C/C++의 lseek() 함수를 활용해 파일에서 일정 간격으로 떨어진 바이트(교차하는 n번째 바이트)를 읽어 다른 파일에 기록하는 방법을 알아봅니다.
두 개의 .txt 파일이 주어지며, 우리의 목표는 파일 디스크립터의 읽기·쓰기 위치(포인터)를 이동시키는 데 사용되는 lseek() 함수를 통해 한 파일의 내용 중 특정 간격의 바이트만 골라내 다른 파일에 쓰는 것입니다.
lseek() 함수란?
lseek()는 열려 있는 파일 디스크립터의 오프셋, 즉 현재 읽기·쓰기 위치를 원하는 지점으로 이동시키는 시스템 콜입니다. 기본 원형은 다음과 같습니다.
off_t lseek(int fd, off_t offset, int whence);
- fd: 대상 파일 디스크립터
- offset: 이동할 상대적 바이트 수
- whence: 기준 위치 — SEEK_SET(파일 시작), SEEK_CUR(현재 위치), SEEK_END(파일 끝)
이 예제에서는 SEEK_CUR를 사용해 현재 위치에서 n바이트 또는 2n바이트씩 건너뛰면서 한 바이트씩 읽어냅니다.
예제 코드
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
void func(char arr[], int n){
int f_read = open("start.txt", O_RDONLY); // 원본 파일
int f_write = open("end.txt", O_WRONLY); // 결과 파일
int count = 0;
while (read(f_read, arr, 1)){
if (count < n) {
lseek(f_read, n, SEEK_CUR); // n바이트 건너뛰기
write(f_write, arr, 1);
count = n;
}
else{
count = 2 * n;
lseek(f_read, count, SEEK_CUR); // 2n바이트 건너뛰기
write(f_write, arr, 1);
}
}
close(f_read);
close(f_write);
}
int main(){
char arr[100];
int n = 5;
func(arr, n);
return 0;
}
코드 동작 방식
- 원본 파일(start.txt)을 읽기 전용(O_RDONLY)으로, 결과 파일(end.txt)을 쓰기 전용(O_WRONLY)으로 엽니다.
- read() 함수로 한 바이트씩 읽으면서 count 변수로 진행 상황을 추적합니다.
- count가 n보다 작으면 lseek()로 n바이트를 건너뛴 뒤, 직전에 읽은 바이트를 결과 파일에 기록하고 count를 n으로 설정합니다.
- 이후에는 매번 2n바이트씩 건너뛰며 바이트를 기록해, 결과적으로 n바이트 간격으로 떨어진 바이트들만 복사됩니다.
- 파일 끝에 도달해 read()가 0을 반환하면 반복이 종료되고, 열어 둔 두 파일을 모두 닫습니다.
실행 결과
입력 파일(start.txt):

출력 파일(end.txt):
