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

时间:2014-01-27 11:16:29

标签: c++ c fwrite

查看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
}

1 个答案:

答案 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