- ベストアンサー
任意のファイルを別のファイルにコピーするプログラム。
コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #include <stdio.h> #include <stdlib.h> main(int argc, char *argv[]) { FILE *fp; if ((fp = fopen(argv[0],"r") == NULL){ printf("ファイル%sが存在しません。\n",argv[0]);exit(-1); } if ((fp = fopen(argv[1],"w") == NULL){ printf("ファイル%sがコピーできません。\n",argv[1]);exit(-1); } fclose(fp); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
おそらくこのソースだとかなり問題があると思います。 1.argv[0]は自分です。 test.exe aaa bbbとした場合、 argv[0]="test.exe" argv[1]="aaa" argv[2]="bbb" となります。 2.fpが一つしか定義されていません。 FILE *fp1, *fp2として二つ定義しそれぞれのポインタを格納しましょう。 ⇒一回目のfopenのfpを二回目で又使ってしまっています。 3.fcloseはファイルごとに行いましょう。 4.これではファイルを開いているだけで、 書き込んでいる作業がどこにもありません 書き込むにはfwriteです。 簡単なフローとしては、 1.argv[1]をオープンして内容を読込み内部バッファに保存しておく。 2.argv[2]をオープンして内部バッファの内容を書き込む。 3.両方クローズする。 ですね。 これ以外にも方法はいろいろあります。 わからなかったら補足して下さい。
その他の回答 (2)
- hitomura
- ベストアンサー率48% (325/664)
他のお二方の回答に加えて、 fopen()の第2引数を上から順に "rb" "wb" にする必要があります。 これがないと、ファイル中の0x1Aをファイル終端として認識してしまい、それ以降のデータはコピーされません。 テキストファイルのコピーだけしか行わない場合は不要ですが…
- toysmith
- ベストアンサー率37% (570/1525)
エラー発生時に処理が中断されていません。 元のファイル(argv[1])が存在しなくても、先のファイル(argv[2])が書きこみ不能でも強引にコピーしようとして更なるエラーを引き起こすでしょう。 一般に、コマンドラインで使用するプログラムはエラーを検知したら 1 エラーを回避する為の処理(正しいファイル名の再入力など)を行う 2 処理を中断する どちらかです。 この場合、エラーメッセージが表示されているので0以外の値でreturnするべきでしょう。 以下、余計なお世話かもしれませんが… ・エラーはメッセージはprintf()よりもperror()のほうがよい ・コピー先ファイルが既に存在するときもエラーにしたほうがよいかもしれない