和 对于可变数量的项目有一个额外的参数fread(3)
。fwrite(3)
因此,典型的写入通常有一个硬编码的计数,因为它只有一个以 char 开头的缓冲区,例如fwrite(data, len, 1, stdout)
。
这个参数有什么意义呢?这是否总是只是一种方便的“让系统进行乘法”的事情calloc(3)
,或者某些历史操作系统和/或存储设备对写入的单个项目有特殊处理?
激发我好奇心的是我偶然发现了一些 IBM z/OS 文档他们的fwrite()
它在“记录 I/O 输出”和“块 I/O 输出”之间进行了一些区分,并讨论了每个项目如何被截断超过一定长度 - 让我想知道项目计数参数是否用于映射到,比如说、单独的物理打孔卡——或者至少可以使用 ASCII“记录分隔符”字符或其他字符在幕后写入数据。
作为对比,POSIX fwrite 规范就直截了当地说:
对于每个对象,应对函数进行 size 调用
fputc()
,从恰好覆盖该对象的无符号字符数组中获取值(按顺序)。
这就引出了一个问题:为什么不像以前那样首先fwrite
考虑const uint8_t*
缓冲区和总长度。size_t
write(2)
答案1
据我所知,这些函数首先出现在 Unix 版本 7 中,并且是在第一个版本中执行,只做fwrite
了一些特殊的事情:它在写入每个数据块后检查流的错误标志,而不是像那样size
检查 的返回值。但看起来除了在发生 I/O 错误时浪费一些额外的周期之外,没有任何实际效果。putc
fread
getc
由于 和putc
都是ferror
简单的宏,我认为这并没有比当时fwrite(b, large_val, 1, f)
快多少fwrite(b, 1, large_val, f)
。
fwrite(ptr, size, count, iop)
unsigned size, count;
register char *ptr;
register FILE *iop;
{
register unsigned s;
unsigned ndone;
ndone = 0;
if (size)
for (; ndone<count; ndone++) {
s = size;
do {
putc(*ptr++, iop);
} while (--s);
if (ferror(iop))
break;
}
return(ndone);
}