ここで、これらの関数を修正しましょう。
size_t fread_buf( void* ptr, size_t size, FILE* stream)
{
return fread( ptr, 1, size, stream);
}
size_t fwrite_buf( void const* ptr, size_t size, FILE* stream)
{
return fwrite( ptr, 1, size, stream);
}
fread()/ へのパラメーターの根拠についてはfwrite()、K&Rのコピーをずっと前に失ってしまったため、推測することしかできません。KernighanとRitchieは、バイナリI / Oの実行はオブジェクトの配列に対して最も自然に行われるだろうと単純に考えていた可能性が高いと考えられます。また、一部のアーキテクチャでは、ブロックI / Oの方が実装が高速/簡単であると考えているかもしれません。
C標準のように指定していてもfread()とfwrite()の観点で実装するfgetc()とはfputc()、標準のCはK&Rによって定義され、物事はオリジナルのデザイナーのアイデアにされているではないかもしれない、標準で指定されたことをされたずっと後に生まれたことを覚えておいてください。K&Rの「Cプログラミング言語」で述べられていることが、言語が最初に設計されたときと同じではない可能性さえあります。
最後に、PJ Plaugerがfread()「標準Cライブラリ」で言っていることは次のとおりです。
場合size(第2)の引数が1より大きい場合、あなたは機能もまで読んでいるかどうか判断できないsize - 1ことが報告されものを超えて追加の文字。原則として、関数を呼び出すfread(buf, 1, size * n, stream);代わりに
fread(buf, size, n, stream);
基本的に、彼fread()はのインターフェースが壊れていると言っています。以下のためにfwrite()私は同意しないだろう声明-彼はそれを指摘し、「これは大きな欠点ではないので、書き込みエラーは、一般的に稀です」。