Estoy usando fwrite para escribir un archivo (es una imagen).
Primero, estoy escribiendo un encabezado que tiene un tamaño fijo
int num_meta_write_bytes = fwrite(headerBuffer, 1, headerSize, file);esto funciona bien
Entonces tengo que escribir los píxeles:
num_write_bytes = fwrite(data_pointer, 1, image_size, file);esto funciona bien
Para mi caso, tengo que escribir un número variable de ceros entre el encabezado y los píxeles, la solución (¿fea?) que encontré es:
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); }(Este código se coloca antes de escribir los píxeles)
Mi pregunta es: ¿hay alguna manera de decirle directamente a fwrite que escriba continuamente el mismo valor padding_zeros veces? en lugar de usar esto for bucle?
Puede crear un bloque de datos lleno de ceros con calloc() , luego escribir esos datos en el archivo en una llamada (y recuerde free los datos después):
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 } Como se menciona en los comentarios, también podría usar una matriz de longitud variable; sin embargo, los VLA son una característica 'opcional' en C (desde el estándar C11), y de todos modos tendría que establecer explícitamente los datos en ceros (con una llamada a memset ), ya que los VLA no se pueden inicializar como ordinarios (tamaño fijo) arreglos
Encontré otra solución, aunque creo que depende del sistema operativo:
fseek(fp, padding_zeros, SEEK_CUR);Esto es bastante rápido ya que no hay asignación. Justo al copiar el archivo resultante, el sistema operativo generará los ceros reales.
Esto funcionó bien en mi objetivo de Linux.