查看fwrite(const void * ptr, size_t size, size_t count, FILE * stream)
的规范,我不确定在编写二进制数据(即一块字节)时,size
参数和count
参数到底是什么。
我是否必须告诉fwrite 写入bufLen
大小为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
}
答案 0 :(得分:3)
fwrite()
函数应从ptr
指向的数组写入最多nitems
个大小由size
指定的元素到stream
对于每个对象(nitems
次调用fwrite()
次),size
调用fputc()
,从数组中获取值(按顺序) unsigned 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