在文件段中写入零

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循环?

Adr*_*ica 6

您可以使用 创建一个零填充的数据块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 无法像普通(固定大小)数组一样进行初始化。