もともとあるファイルの内容を違うファイルにコピーするプログラムで 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:ファイルのコピー
while文で指定するのは、ループ終了条件ではなく、ループ継続条件です。
((ch = fgetc(from)) == EOF)
→((ch = fgetc(from)) != EOF)
とするとどうなりますか?
((ch = fgetc(from)) == EOF)
→((ch = fgetc(from)) != EOF)
とするとどうなりますか?
Re:ファイルのコピー
ありがとうございました。
おかげさまで問題が解決しました。
こういったうっかりミスでプログラムって全然動かないもんですね。
これからも精進していきます。
適切な指導ありがとうございました!
おかげさまで問題が解決しました。
こういったうっかりミスでプログラムって全然動かないもんですね。
これからも精進していきます。
適切な指導ありがとうございました!
Re:ファイルのコピー
> if (argc == 4 || !(strcmp(argv[3],"watch")))
このままだと、argc==3のときに範囲外のargv[3]にアクセスすることになり、危険です。
if (argc == 4 && !(strcmp(argv[3],"watch")))
とすべきだと思います。
(追記)
間違っていたので修正しました。
このままだと、argc==3のときに範囲外のargv[3]にアクセスすることになり、危険です。
if (argc == 4 && !(strcmp(argv[3],"watch")))
とすべきだと思います。
(追記)
間違っていたので修正しました。
