ファイルの単純なコピー(C言語)

C言語の stdio(標準入出力ライブラリ)のお勉強をしたので、ファイルのコピーをする関数 my_copy() を書いてみました。Linux Mint 18.2 + gcc で確認しました。

mycopy.c

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main(){
    my_copy("mycopy.c", "another_mycopy.c");
    exit(0);
}

void my_copy(char *from[], char *to[]) {
    FILE *f1, *f2;
    int c;
    
    f1 = fopen(from, "r");
    if (!f1) err(from);
    
    file_exist(to);
    f2 = fopen(to, "w");
    if (!f2) err(to);
    
    while ((c = fgetc(f1)) != EOF) {
        if (fputc(c, f2) == EOF) err(to);
    }
    
    fclose(f2);
    fclose(f1);
}

int err(const char *s) {
    perror(s);
    exit(1);
}

//コピー先のファイルが既に存在しているならエラー終了
void file_exist(char *fname[]) {
    struct stat st;    //#include <sys/stat.h>が必要

    if (!stat(fname, &st)) {
        printf("File %s already exists.\n", fname);
        exit(1);
    }
}

コピー先のファイルが既に存在するならば、コピーをせずにエラー終了します。
fgetc も fputc も一文字の入出力だが、stdio は「バッファリング」をするので大丈夫。一文字のせいで遅くなったりしません。


main() 関数を次のように変更すれば、コマンドライン引数を取ってコピーすることができます。

int main(int argc, char *argv[]){
    if (argc != 3) {
        printf("引数の数は2でなければなりません。\n");
        exit(1);
    }
    
    my_copy(argv[1], argv[2]);
    exit(0);
}

実行。

$ ./mycopy mycopy.c another_mycopy.c

こんな感じです。