如何正确设置fwrite()的大小和计数参数以编写一块字节

How to correctly set size and count parameters for fwrite() to write a chunk of bytes?

本文关键字:参数 字节 一块 fwrite 设置 何正确      更新时间:2023-10-16

查看fwrite(const void * ptr, size_t size, size_t count, FILE * stream)的规格,我不确定编写二进制数据时的size参数和count参数到底是什么,即字节的一部分。

我是否必须告诉fwrite到bufLen大小1 的块,还是应该告诉写1个大小 bufLen 的块?这些都更好吗?它如何影响返回的值?在发生错误的情况下,它如何影响行为?
如果我指定写一个大小 bufLen的块,它始终写入完整的数据还是什么都没有?

在代码中,看起来像这样:

char* buf = ...;
int bufLen = ...;
FILE* file = ...;
/* alternative 1: */ int writtenByteCount = fwrite(buf, 1, bufLen, file);
/* alternative 2: */ int writtenByteCount = fwrite(buf, bufLen, 1, file);
printf("fwrite wrote %i of %i bytes/blocks", writtenByteCount, bufLen);
if (writtenByteCount < bufLen) {
    // handle error
}

fwrite()函数应从 ptr指向的数组中写入 nitems元素的大小由 size指定为 stream

对于每个对象(nitems次调用的CC_12次),应对fputc()进行size调用,从一个无符号char数组中取出值(按顺序),完全覆盖了对象。

只要基础写入被缓冲(大多数文件系统通常是这种情况),两种情况的性能差异就可以忽略不计。

流的文件位置指示器(如果定义)应通过成功编写的字节数来提出。如果发生错误,则未指定流的文件位置指示器的结果值。


当执行部分写入并返回fwrite()时,两个变体的不同之处在于。然后,具有较小的size和较大的nitems在返回值中提供较高的粒度。

例如,如果仅编写5个字节(尝试编写10个字节),

// case 1
fwrite(bufptr, 1, 10, fptr);
// returns 5. As 5 out of 10 items written successfully
// case 2
fwrite(bufptr, 10, 1, fptr);
// returns 0. As 0 out of 1 item written