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
こんな感じです。
ふつうのLinuxプログラミング Linuxの仕組みから学べるgccプログラミングの王道
- 作者: 青木峰郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2005/07/27
- メディア: 単行本
- 購入: 35人 クリック: 450回
- この商品を含むブログ (150件) を見る