2016-03-17 10 views
1

Я пытаюсь проанализировать заголовок файла .wav. Если я удалю строку chunk_size +=..., я получаю результат ожидания: RIFF, но как только я добавлю эту строку, я получаю RIFFÄÿÿÿ. Почему каждая добавленная стоимость добавляется к chunk_size, по-видимому, «прилагается» к chunk_id? Как может chunk_id иметь более четырех элементов? Есть ли что-то основное в массивах или двоичных данных, которые я не понимаю? Нельзя ли использовать cout в массиве символов? толькоДобавление в int изменяет отдельный массив символов?

struct Wave 
{ 
    Wave (FILE* file) { 
     char header[44]; 
     uint size = fread(header, sizeof(char), 44, file); 
     chunk_size = 0; 
     for (uint i = 0; i < 4; i ++) { 
      chunk_id[i] = header[i]; 
      chunk_size += header[i + 4] * pow(16, i); 
     } 
     cout << chunk_id; 
    } 
    char chunk_id[4]; 
    uint chunk_size; 
    char format[4]; 
    ... 
    ... 
    ... 
}; 
+0

Возможно, вы не понимаете, как работает 'cout << chunk_id'. Кажется, у вас есть массивы и двоичные данные. –

+0

Файл был открыт в двоичном режиме, я полагаю? – PaulMcKenzie

+1

'pow (16, i);' - это не гарантируется, поскольку вы ожидаете его: http://stackoverflow.com/questions/25678481/why-pown-2-return-24-when-n- 5 – PaulMcKenzie

ответ

2
cout << chunk_id; 

работы при chunk_id является нулем. Так как это не в вашей программе, программа имеет неопределенное поведение.

Сделайте chunk_id массив из 5 элементов и убедитесь, что он завершен в конструкторе.

Wave (FILE* file) { 
    char header[44]; 
    uint size = fread(header, sizeof(char), 44, file); 
    chunk_size = 0; 
    for (uint i = 0; i < 4; i ++) { 
     chunk_id[i] = header[i]; 
     chunk_size += header[i + 4] * pow(16, i); 
    } 
    chunk_id[4] = '\0'; 
    cout << chunk_id; 
} 
char chunk_id[5]; 
+0

Возможно, вам стоит объяснить, как исправить проблему, что должно быть довольно простым для этого случая. –

+0

Итак, что-то не так с 'chunk_id', но с тем, как я пытаюсь его просмотреть? – user1986358

+0

@ пользователь1986358, это правильно. –