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;
}
': ) 파일처리' 카테고리의 다른 글
[C언어_파일처리] 오프셋과 바이트 수를 이용해 파일에 있는 값 삭제하기 (delete) (0) | 2022.04.04 |
---|---|
[C언어_파일처리] 파일에서 오프셋을 기준으로 데이터 끼워넣기 (insert) (0) | 2022.04.04 |
[C언어_파일처리] 파일에 데이터 덮어쓰기 (overwrite) (0) | 2022.04.04 |
[C언어-파일처리] 두 개의 파일 병합하기 (merge) (0) | 2022.04.04 |
[C언어_파일처리] 파일 복사하기 (copy) (0) | 2022.04.04 |