バイナリーファイルをコピーするプログラムです。
以下は正常に動作したプログラムです。
C
1#include<stdio.h> 2 3#define BSIZE 1024 4 5int main(int argc, char* argv[]){ 6 int n; 7 FILE *src, *dst; 8 unsigned char buf[BSIZE]; 9 10 if(argc != 3){ 11 fprintf(stderr, "パラメータが不正です。\n"); 12 } else { 13 if((src = fopen(*++argv, "rb")) == NULL){ 14 fprintf(stderr, "ファイル%sをオープンできませんでした。\n", *argv); 15 return 1; 16 } else if((dst = fopen(*++argv, "wb")) == NULL){ 17 fprintf(stderr, "ファイル%sをオープンできませんでした。\n", *argv); 18 fclose(src); 19 return 1; 20 } else { 21 while((n = fread(buf, sizeof(unsigned char), BSIZE, src)) > 0){ 22 fprintf(stderr, "n = %d\n", n); 23 fwrite(buf, sizeof(unsigned char), n, dst); 24 } 25 fclose(src); 26 fclose(dst); 27 } 28 } 29 30 return 0; 31} 32
ところが、私が持っている本の中では、コピーを行っている部分が以下のようになっていました。
while((n = fread(buf, BSIZE, 1, src)) > 0){ fprintf(stderr, "n = %d\n", n); fwrite(buf, n, 1, dst); }
最初この通りに作ったのですが、うまく行かなかったので自分で作り変えました。
しかしよく考えると、疑問です。
下の方でも良いような気がします。
なぜ下のやり方ではうまく行かないのでしょうか??
fprintf はテスト用に入れてあります。
下のプログラムを実行すると n = 1と表示されて終わります。
つまりループが一回しか実行されていないことになります。
なんで一回で終わってしまうんでしょうか?
下のやり方ではできない理由を教えてください。
実行環境は Linux 64bit gcc です。
皆さんの環境では、どうなりますかね?
正常に動作しますか??

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/12/03 08:16
2017/12/03 08:22 編集
2017/12/03 09:13
2017/12/03 12:28 編集