質問: fread(buf, BSIZE, 1, src)) > 0) { //コピー元ファイル名(src)からbufに読み込む // ファイルポインタsrcから BSIZE バイトのデータを // 1 個読み込み、読み込みデータ格納先のポインタbufに格納する */ fwrite(buf, n, 1, dst); //bufからコピー先ファイル名(dst)に読み込む } fclose(src); fclose(dst); } } return (0) } 実行結果 ...@naka ~ $ gcc -o bcopy bcopy.c -Wall ...@naka ~ $ bcopy LACKNUM2.DAT LACKNUM3.DAT ...@naka ~ $ ```
回答: これ、よく初心者がハマるところです。 freadのリファレンス(MSDNより)をよーーーく見てみましょう。 以下抜粋 ``` size_t fread( void *buffer, size_t size, size_t count, FILE *stream ); ``` > > **パラメーター** > > buffer > > データの格納場所。 > > size > > 項目のバイト単位のサイズ。 > > count > > 読み取る項目の最大数。 > > stream > > FILE 構造体へのポインター。 > > > 戻り値 > > fread で エラーが発生したり、ファイルの末尾に到達する countの前に発生した実際に読み込まれる count 未満である、完全な項目数を返します。 > > > 戻り値の「項目数」って......。 つまりこういうことです。 > > n = fread(buf, BSIZE, 1, src) > > fwrite(buf, n, 1, dst); > > > fread関数でBSIZEバイトのデータを「1個」読み込み、成功したので「1個読んだよ」という意味で「1」が返されます。そして結果的fwrite関数に「1バイトのデータを1個書け」というふうに引数が渡されるので、期待通りに動かないというわけです。 fread、fwriteには、第2引数に1を、サイズは第3引数に指定するというのが定石です。これだと、1バイトのデータをBSIZE個読み込む、あるいは書き込む、という意味になり、期待通りに動くようになります。 追記 すみません。ちょっと見落としていましたコピー先「LACKNUM3.DAT」が0バイトですね。 > > #define BSIZE 128 > > > 前述のfreadで128バイトのデータを1個読むように指定していますが、srcのファイルが128バイトに満たず、結果的に「読めなかった」ので「0」が返されますね。 対処方法は前述の通りです。バイト単位で処理できるようにすることで、そのような問題も回避できます。