在文件段中写入零

Writting zeros in file segment

我正在使用 fwrite 写入一个文件(它是一个图像)。

首先,我正在编写一个 header 具有固定大小的

int num_meta_write_bytes = fwrite(headerBuffer, 1, headerSize, file);

这行得通

那我就要写像素了:

num_write_bytes = fwrite(data_pointer, 1, image_size, file);

这行得通

对于我的情况,我必须在 header 和像素之间写入可变数量的零,我找到的(丑陋的?)解决方案是:

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);
}

(这段代码放在写像素之前)

我的问题是:有没有办法直接告诉fwrite连续写入相同的值padding_zeros次?而不是使用这个 for 循环?

您可以使用 calloc() 创建一个 zero-filled 数据块,然后在一次调用中将该数据写入文件(记住之后要 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
}

如评论中所述,您还可以使用可变长度数组;但是,VLA 是 C 中的一个 'optional' 特性(自 C11 标准起),无论如何您都必须将数据显式设置为零(通过调用 memset),因为 VLA 无法像这样初始化普通 (fixed-size) 数组。

我找到了另一个解决方案,虽然我认为是 OS 依赖:

fseek(fp, padding_zeros, SEEK_CUR);

这非常快,因为没有分配。就在复制结果文件时,OS 将生成实际的零。

这在我的 linux 目标中运行良好。