Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++ lseek() 함수로 n번째 바이트를 건너뛰며 읽어 다른 파일에 쓰는 방법

개요

이 튜토리얼에서는 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;
}

코드 동작 방식

  1. 원본 파일(start.txt)을 읽기 전용(O_RDONLY)으로, 결과 파일(end.txt)을 쓰기 전용(O_WRONLY)으로 엽니다.
  2. read() 함수로 한 바이트씩 읽으면서 count 변수로 진행 상황을 추적합니다.
  3. count가 n보다 작으면 lseek()로 n바이트를 건너뛴 뒤, 직전에 읽은 바이트를 결과 파일에 기록하고 count를 n으로 설정합니다.
  4. 이후에는 매번 2n바이트씩 건너뛰며 바이트를 기록해, 결과적으로 n바이트 간격으로 떨어진 바이트들만 복사됩니다.
  5. 파일 끝에 도달해 read()가 0을 반환하면 반복이 종료되고, 열어 둔 두 파일을 모두 닫습니다.

실행 결과

입력 파일(start.txt):

C/C++ lseek() 함수로 n번째 바이트를 건너뛰며 읽어 다른 파일에 쓰는 방법

출력 파일(end.txt):

C/C++ lseek() 함수로 n번째 바이트를 건너뛰며 읽어 다른 파일에 쓰는 방법