在这里,让我修复这些功能:
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 之后很久就已经存在,并且标准中指定的内容可能不在最初设计者的想法中。K&R 的“C 编程语言”中所说的内容甚至可能与最初设计该语言时不同。fgetc()
fputc()
fread()
最后,这是 PJ Plauger在“标准 C 库”中所说的:
如果size
(第二个)参数大于 1,则您无法确定该函数是否还读取了size - 1
超出其报告内容的其他字符。通常,您最好调用该函数fread(buf, 1, size * n, stream);
而不是
fread(buf, size, n, stream);
基本上,他是说fread()
的界面坏了。因为fwrite()
他指出,“写错误通常很少见,所以这不是主要缺点”——我不同意这种说法。