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.