• ベストアンサー

任意のファイルを別のファイルにコピーするプログラム。

コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが… #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); } どこか間違っているところがあるでしょうか? ありましたら詳しく教えてもらえると幸いです。 少し自信がないのでわかる方はよろしくおねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

おそらくこのソースだとかなり問題があると思います。 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)
回答No.3

他のお二方の回答に加えて、 fopen()の第2引数を上から順に "rb" "wb" にする必要があります。 これがないと、ファイル中の0x1Aをファイル終端として認識してしまい、それ以降のデータはコピーされません。 テキストファイルのコピーだけしか行わない場合は不要ですが…

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

エラー発生時に処理が中断されていません。 元のファイル(argv[1])が存在しなくても、先のファイル(argv[2])が書きこみ不能でも強引にコピーしようとして更なるエラーを引き起こすでしょう。 一般に、コマンドラインで使用するプログラムはエラーを検知したら 1 エラーを回避する為の処理(正しいファイル名の再入力など)を行う 2 処理を中断する どちらかです。 この場合、エラーメッセージが表示されているので0以外の値でreturnするべきでしょう。 以下、余計なお世話かもしれませんが… ・エラーはメッセージはprintf()よりもperror()のほうがよい ・コピー先ファイルが既に存在するときもエラーにしたほうがよいかもしれない

関連するQ&A