Подтвердить что ты не робот

Накладные данные при записи в двоичный файл

Я хочу написать массив, содержащий 16-битные целые числа в качестве исходного двоичного файла, и попытался в следующем примере:

#  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);
}

Однако вывод содержит больше, чем просто нули.

$ hexdump -v rawPcm 
0000000 0000 0000 0000 85fd 0804 0001 0000 0000
0000010 0000 85fd 0804 0001                    
0000018

Он пишет 0000 0000 0000 85fd 0804 0001 для каждого fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);, в то время как я ожидаю получить только 0000 0000 0000.

Что дополнительные данные представляют 85fd 0804 0001 и как я могу предотвратить его появление?

4b9b3361

Ответ 1

Что представляют дополнительные данные 85fd 0804 0001

Возможно, некоторые случайные данные мусора.

как я могу предотвратить его появление?

fwrite(buff,sizeof(int16_t), sizeof(buff),rawf); должен быть записан как:

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] получает длину массива в количестве объектов (или членов), а sizeof buff задает размер массива в байтах.

Итак, вы читаете buff и записываете его в файл и вызываете undefined поведение. В вашем случае вы видите случайные данные мусора, которые записываются в выходной файл.

В вашем случае sizeof каждого элемента в buff составляет 2 байта, а массив buff имеет 3 члена, в результате чего общий размер составляет 6 байтов. Когда вы пишете fwrite(buff,sizeof(int16_t), sizeof(buff),rawf);, 6 файлов по 2 байта записываются в файл, который не является тем, что вы хотите сделать.

Теперь вы пишете 6 данных типа (размер) int16_t, начиная с buff[0] i.e. buff[0..5] до выхода. buff[0..2] являются 0, как ожидалось, и buff[3..5] являются мусором.

Ответ 2

Третий аргумент fwrite - это количество элементов размера, заданных вторым параметром. Это не общий размер в байтах, который вы сейчас делаете.

Итак, вы перекрываете свой буфер.