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

[C언어_파일처리] 파일에서 오프셋을 기준으로 데이터 끼워넣기 (insert)

by miiinn 2022. 4. 4.

OS : Linux 우분투 버전 18.04

컴파일러 : gcc 7.5

 

 

[명세]

이미 존재하는 파일에서 <오프셋(=0, 1, 2, ...)>과 <오프셋+1> 사이에 <데이터>를 끼워 넣는다. <오프셋>이 파일의 맨마지막(EOF제외)을 가리키면 append로 처리한다. <데이터>는 큰따옴표(“와 ”)로 묶어서 표현한다 (“abc”라고 입력하면 abc가 끼워넣을 데이터를 의미한다).
 
a.out <오프셋> <데이터> <파일명>

 

 

 

[소스 코드] - insert.c

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

int main(int argc, char *argv[]){
    int offset = atoi(argv[1]);
    FILE *fp = fopen(argv[3], "r+");

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

    if(offset < 0|| offset > size){
        printf("offset이 음수이거나 읽을 수 있는 파일크기를 초과했습니다\n");
        return 0;
    }
    
    else if ( offset == size-1|| offset == size){  // 파일의 맨마지막 이므로 append처리
        // printf("%s\n",)
        fseek(fp, -1, SEEK_END); // 맨 마지막부터 문자 삽입
        fwrite(argv[2],sizeof(char), strlen(argv[2]), fp);
        //fputs(argv[2], fp);  // 개행??
        return 0;
     }

    fseek(fp, offset+1, SEEK_SET); // offset다음 부터 복사해두기
    
    int buffer_size = size-offset;

    //뒤에 내용 복사해놓기
    char *buffer = (char *)malloc(sizeof(char *)*sizeof(buffer_size)); // 넉넉히 할당..
    fread(buffer, sizeof(char), buffer_size, fp); // char크기만큼 buffer번 가져오기

    fseek(fp, offset+1, SEEK_SET);//offset 뒤부터 넣어야함

    fputs(argv[2],fp);// 입력받은 문자 넣기

    fputs(buffer,fp); // 복사해뒀던 뒷부분 붙여넣기

    fclose(fp);
    
    return 0;
}