最新閲覧日:

コマンドラインからコピー元、コピー先ファイル名を指定してファイルをコピーするプログラムなんですが…

#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);
}

どこか間違っているところがあるでしょうか?
ありましたら詳しく教えてもらえると幸いです。
少し自信がないのでわかる方はよろしくおねがいします。

このQ&Aに関連する人気のQ&A

A 回答 (3件)

他のお二方の回答に加えて、


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

エラー発生時に処理が中断されていません。


元のファイル(argv[1])が存在しなくても、先のファイル(argv[2])が書きこみ不能でも強引にコピーしようとして更なるエラーを引き起こすでしょう。

一般に、コマンドラインで使用するプログラムはエラーを検知したら
1 エラーを回避する為の処理(正しいファイル名の再入力など)を行う
2 処理を中断する
どちらかです。

この場合、エラーメッセージが表示されているので0以外の値でreturnするべきでしょう。

以下、余計なお世話かもしれませんが…
・エラーはメッセージはprintf()よりもperror()のほうがよい
・コピー先ファイルが既に存在するときもエラーにしたほうがよいかもしれない
    • good
    • 0

おそらくこのソースだとかなり問題があると思います。



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.両方クローズする。
ですね。

これ以外にも方法はいろいろあります。
わからなかったら補足して下さい。
    • good
    • 0

このQ&Aに関連する最新のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ