在文件段中写入零
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 目标中运行良好。
我正在使用 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 目标中运行良好。