Quiero escribir una matriz que contenga enteros de 16 bits como binario sin formato en un archivo y lo he intentado con el siguiente ejemplo:
# define __int8_t_defined __intN_t (8, __QI__); __intN_t (16, __HI__); __intN_t (32, __SI__); __intN_t (64, __DI__); int main(int argc, char *argv[]) { FILE * rawf; rawf = fopen("./rawPcm","wb"); int16_t buff[] = {0,0,0}; fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); fclose(rawf); }Sin embargo, la salida contiene más que solo ceros.
$ hexdump -v rawPcm 0000000 0000 0000 0000 85fd 0804 0001 0000 0000 0000010 0000 85fd 0804 0001 0000018 Escribe 0000 0000 0000 85fd 0804 0001 para cada fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); mientras que esperaría obtener solo 0000 0000 0000 .
¿Qué representan los datos adicionales 85fd 0804 0001 y cómo evito que ocurra?
¿Qué representan los datos adicionales
85fd 0804 0001
Posiblemente algunos datos basura aleatorios.
como evito que ocurra?
fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); debe escribirse como:
fwrite(buff,sizeof(int16_t), sizeof(buff) / sizeof(buff[0]),rawf); /* ^ ^^^^^^^^^^^^^^^ */ /* size of each object Count of objects */ /* (2) (3) */ /* or */ fwrite(buff, sizeof buf[0], sizeof buff / sizeof buff[0], rawf); sizeof buff / sizeof buff[0] obtiene la longitud de la matriz en número de objetos (o miembros), mientras que sizeof buff proporciona el tamaño de la matriz en bytes.
Por lo tanto, está leyendo más allá del buff y lo está escribiendo en el archivo e invocando un comportamiento indefinido . En su caso, está viendo que los datos basura aleatorios se escriben en el archivo de salida.
En su caso, el sizeof de cada elemento en buff es de 2 bytes y la matriz buff tiene 3 miembros, lo que hace que el tamaño total sea de 6 bytes. Cuando escribes fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); , 6 objetos de 2 bytes cada uno se escriben en el archivo, lo cual no es algo que desee hacer.
Ahora está escribiendo 6 datos de tipo (tamaño) int16_t comenzando desde buff[0] es decir, buff[0..5] a la salida. buff[0..2] son 0 s como se esperaba y buff[3..5] son basura.
El tercer argumento de fwrite es el número de elementos de tamaño especificado por el segundo parámetro. No es el tamaño total en bytes, lo que está haciendo actualmente.
Así que estás sobrepasando tu búfer.