본문 바로가기
프로그래밍/C & C++

파일 복사 관련 노트

by 리나그(ReenAG) 2021. 11. 18.
728x90
반응형

기본적으로 파일을 열때 파일 핸들러인 FILE* 에 fopen 함수를 이용해서 연다.

좀 최저 계층 이야기라서 이게 정말로 쓸모가 있는지는 모르겠지만, python에서도 비슷하게 공부를 했던 적이 있어서 적어놓으려고 한다.

 

C프 과제 중에 하나가 파일을 복사하는 프로그램을 만드는 것인데, 그 코드가 대략 이러하다 :

#include<stdio.h>

int main(int argc, char **argv){
    if(argc < 3)
        return 1;

    FILE *ip, *op;
    ip = fopen(argv[1], "r");
    op = fopen(argv[2], "w");

    if(!ip || !op)
        return 1;
    char ch;
    while(fscanf(ip, "%c", &ch) > 0)
        fprintf(op, "%c", ch);

    fclose(ip);
    fclose(op);
    return 0;
}

이 코드는 program.exe ./input.txt ./output.txt 같이 적으면 input.txt의 내용물을 output.txt로 복사한다. 다만 문제는 png, jpg, exe등의 파일들에는 NULL등의 BLOB가 있기 때문에 그냥 맘대로 복사가 안된다. 교수님 말로는 ascii만 복사가 될거라고 한다. (다만 그냥 한글도 되는 걸로 봐서는 EUC-KR, UTF-8등은 될수도...) 아무튼 나머지 파일들도 돌리기 위해선, 바이러니 모드를 이용해서 돌려야한다. 따라서 좀 다르게 코드를 짜면,

#include<stdio.h>

int main(int argc, char **argv){
    if(argc < 3)
        return 1;

    FILE *ip, *op;
    ip = fopen(argv[1], "rb");
    op = fopen(argv[2], "w");

    if(!ip || !op)
        return 1;
    
    char buf[1024] = {0};
    int read;

    while((read = fread(buf, 1, 1024, ip)) > 0)
        fwrite(buf, 1, read, op);

    fclose(ip);
    fclose(op);
    return 0;
}

이렇게 하면 왠만해서는 동작할 것이다. 아래의 while도 fread / fwrite로 바꾸었음에 주의. fprintf, fscanf등은 먹지 않는다.

728x90
반응형