ここで、これらの関数を修正します。
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()
で実装されることが規定されていますが、この標準は、K&R によって C が定義されてからずっと後に存在したこと、fgetc()
および標準で規定されていることは元の設計者のアイデアには含まれていなかった可能性があることを思い出してください。fputc()
K&R の「C プログラミング言語」で述べられていることは、言語が最初に設計されたときと同じではない可能性さえあります。
fread()
最後に、 「The Standard C Library」でPJ Plauger が述べていることは次のとおりです。
size
(2 番目の) 引数が 1 より大きい場合、関数が報告する文字数を超えて追加の文字を読み取るかどうかを判断できませんsize - 1
。fread(buf, 1, size * n, stream);
原則として、代わりに
as として関数を呼び出すほうがよいでしょう。fread(buf, size, n, stream);
fread()
基本的に、彼は のインターフェイスが壊れていると言っています。fwrite()
彼は、「書き込みエラーは一般的にまれであるため、これは大きな欠点ではありません」と述べているため、私は同意しません。