Iva*_*van 2 c fwrite zero-padding
我用来fwrite
写一个文件(它是一个图像)。
首先,我正在编写一个具有固定大小的标题
int num_meta_write_bytes = fwrite(headerBuffer, 1, headerSize, file);
Run Code Online (Sandbox Code Playgroud)
这工作正常
然后我必须写像素:
num_write_bytes = fwrite(data_pointer, 1, image_size, file);
Run Code Online (Sandbox Code Playgroud)
这工作正常
对于我的情况,我必须在标题和像素之间写入可变数量的零,我发现的(丑陋的?)解决方案是:
for (size_t i = 0; i < padding_zeros; i++) //padding_zeros is calculated in runtime
{
uint8_t zero = 0;
num_meta_write_bytes += fwrite(&zero, 1, sizeof(uint8_t), fp);
}
Run Code Online (Sandbox Code Playgroud)
(此代码放置在写入像素之前)
我的问题是:有没有办法直接告诉fwrite
连续写入相同的值padding_zeros
次数?而不是使用这个for
循环?
您可以使用 创建一个零填充的数据块calloc()
,然后在一次调用中将该数据写入文件(然后记住free
该数据):
uint8_t* zeros = calloc(padding_zeros, sizeof(uint8_t));
if (zeros) {
num_meta_write_bytes += fwrite(zeros, sizeof(uint8_t), padding_zeros, fp);
free(zeros);
}
else {
// Error handling, or use your 'loop' method if calloc fails
}
Run Code Online (Sandbox Code Playgroud)
正如评论中提到的,您还可以使用可变长度数组;然而,VLA 是 C 中的“可选”功能(自 C11 标准起),并且您无论如何都必须显式地将数据设置为零(通过调用memset
),因为 VLA 无法像普通(固定大小)数组一样进行初始化。