본문 바로가기
: ) 파일처리

[C언어_파일처리] 오프셋, 바이트 수를 기준으로 파일 읽기 (read)

by miiinn 2022. 4. 4.

OS : Linux 우분투 버전 18.04

컴파일러 : gcc 7.5

 

 

[명세]

이미 존재하는 파일에서 <오프셋(offset= 0, 1, 2, ...)>을 기준으로 왼쪽편 또는 오른쪽편에 존재하는 <바이트 수>의 절대값에 해당하는 크기만큼의 데이터를 읽어서 화면에 출력한다. 만약 <바이트 수>가 양수이면 오른쪽편의 데이터를, 음수이면 왼쪽편의 데이터를 읽는다. <바이트 수>가 0이면 데이터를 읽을 필요가 없으며 당연히 화면에 출력되는 데이터도 존재하지 않는다. <바이트 수>의 절대값만큼의 데이터가 왼쪽 또는 오른쪽에 존재하지 않으면 존재하는 데이터만 읽으면 된다. 예를 들면, <오프셋>이 10이고 <바이트 수>가 -5이면 오프셋 5부터 9까지 데이터를 읽어서 출력한다.
 
a.out <오프셋> <바이트 수> <파일명>

 

 

 

[소스 코드] - read.c

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    int offset = atoi(argv[1]); // offset값
    int byte = atoi(argv[2]); // byte 수 
    FILE *fp = fopen(argv[3],"r"); // 파일 오픈

    if (byte==0){printf("바이트 수가 0 이므로 데이터를 읽지 않습니다.\n"); return 0;} // 바이트 수가 0이면 끝

    //파일 크기
    fseek(fp,0,SEEK_END);
    int size = ftell(fp);

    int dif = ((size - (size-offset))); // 읽을 바이트 수보다 적으면 앞에부터 몇 개 읽을지 

    fseek(fp, offset, SEEK_SET); // 처음으로부터 offset만큼 이동

    char *buffer;
    buffer = (char *) malloc(sizeof(char)*abs(byte)); //byte의 절댓값 만큼 공간할당


    if (byte<0) {  // byte가 음수
        fseek(fp, byte, SEEK_CUR); // offset-byte로 이동
        
        if ( dif < abs(byte) ) { // 앞에 문자가 읽을 바이트 수보다 적게 있는 경우
            fseek(fp, 0, SEEK_SET); //맨앞부터
            fread(buffer,sizeof(char), dif, fp); // dif 만큼 읽기
            printf("%s\n", buffer);
            return 0;
        }
 

        fread(buffer,sizeof(char),abs(byte),fp); // 절댓값 바이트 수 만큼 앞에 읽기
        printf("%s\n",buffer);
    }
    else if (byte>0){ // byte가 양수
        fseek(fp,1,SEEK_CUR); // 오른쪽으로 하나 이동
        fread(buffer,sizeof(char), byte,fp); 
        printf("%s\n",buffer);
    }

    free(buffer);
    return 0;
}