ページ 11

ファイルのコピー

Posted: 2010年10月10日(日) 19:26
by IT侍
もともとあるファイルの内容を違うファイルにコピーするプログラムで watch を入力するとそのファイルの内容をコマンドに表示させるプログラムなのですが、なぜかうまくいきません。コマンドに永遠に????が表示されてしまいます。
どうしてでしょうか?ご教授願います。以下がソースです。何故かファイルもコピーされてません。何が原因なのでしょうか。


#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char *argv[/url])
{
FILE *to, *from;
char ch,watch;

if (argc < 3 || argc > 4){
puts("エラーです。正しい使用法で使用してください。\n"
"<プログラム名> <元のファイル名> <コピー先のファイル名> <watch>");
exit(1);
}

if ((from = fopen(argv[1],"r")) == NULL){
puts("error! I can't this program");
exit(1);
}

if ((to = fopen(argv[2],"w")) == NULL){
puts("error!");
exit(1);
}

if (argc == 4 || !(strcmp(argv[3],"watch")))
watch = 1;
else
watch = 0;


while ((ch = fgetc(from)) == EOF){
fputc(ch,to);
if(watch)
putchar(ch);
}

fclose(to);
fclose(from);

return 0;

}

Re:ファイルのコピー

Posted: 2010年10月10日(日) 19:32
by Poco
while文で指定するのは、ループ終了条件ではなく、ループ継続条件です。
((ch = fgetc(from)) == EOF)
→((ch = fgetc(from)) != EOF)
とするとどうなりますか?

Re:ファイルのコピー

Posted: 2010年10月10日(日) 20:07
by IT侍
ありがとうございました。
おかげさまで問題が解決しました。
こういったうっかりミスでプログラムって全然動かないもんですね。

これからも精進していきます。
適切な指導ありがとうございました!

Re:ファイルのコピー

Posted: 2010年10月10日(日) 20:42
by みけCAT
> if (argc == 4 || !(strcmp(argv[3],"watch")))
このままだと、argc==3のときに範囲外のargv[3]にアクセスすることになり、危険です。
if (argc == 4 && !(strcmp(argv[3],"watch")))
とすべきだと思います。

(追記)
間違っていたので修正しました。 画像