输入文件为in.wav
。我必须读取块(成功)并读取样本以规范化音频文件...
问题是它在尝试查找.wav文件样本的max
和min
值时崩溃了。
它只会找到数组中的最小值和最大值,但它会崩溃...
请告诉我有什么问题。
以下是代码:
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
#define hdr_SIZE 64
typedef struct FMT
{
char SubChunk1ID[4];
int SubChunk1Size;
short int AudioFormat;
short int NumChannels;
int SampleRate;
int ByteRate;
short int BlockAlign;
short int BitsPerSample;
} fmt;
typedef struct DATA
{
char Subchunk2ID[4];
int Subchunk2Size;
int Data[441000];
} data;
typedef struct HEADER
{
char ChunkID[4];
int ChunkSize;
char Format[4];
fmt S1;
data S2;
} header;
int main()
{
FILE *input = fopen( "in.wav", "rb"); /// nameIn
if(input == NULL)
{
printf("Unable to open wave file (input)\n");
exit(EXIT_FAILURE);
}
FILE *output = fopen( "out.wav", "wb"); /// nameOut
header hdr;
fread(&hdr, sizeof(char), hdr_SIZE, input);
/* NOTE: Chunks has been copied successfully. */
/*###############################*/
/*##### UPDATE (char *ptr;) #####*/
/*###############################*/
char *ptr; // 'int' was written here instead of 'char'. That's was a stupid mistake...
long n = hdr.S2.Subchunk2Size;
/// COPYING SAMPLES...
ptr = malloc(sizeof(hdr.S2.Subchunk2Size));
while ( n-- != 0 )
{
fread(&ptr, 1, 1, input); // Continues reading after the least 'stop' place.
} // I was being told here (on "stack") that it is so...
n = hdr.S2.Subchunk2Size; // Resetting 'n'.
int min = ptr[0], max = ptr[0], i;
/* THE PROBLEM IS HERE: */
for ( i = 0; i < n; i++ )
{
if ( ptr[i] < min ) // If the next elements is less than previous, swap them.
min = ptr[i];
if ( ptr[i] > max ) // If the next elements is bigger than previous, swap them.
max = ptr[i];
}
printf("> > >%d__%d\n", min, max); // Displaying of 'min' and 'max'.
fclose(input);
fclose(output);
return 0;
}
更新
EUREKA!这都是因为每个样本8位!我必须和他们一起操作(带样本)和一种char。 (请参阅我的“### UPDATE ###” - 代码中的注释)
答案 0 :(得分:1)
此代码:
/// COPYING SAMPLES...
ptr = malloc(sizeof(hdr.S2.Subchunk2Size));
while ( n-- != 0 )
{
fread(&ptr, 1, 1, input); // Continues reading after the least 'stop' place.
} // I was being told here (on "stack") that it is so...
覆盖ptr
变量n
次的第一个字节。这会破坏ptr
的价值。即使您修改它以读取已分配的缓冲区(通过删除&
),您也只会重写已分配内存的第一个字节。
你可能想要的是:
fread(ptr, 1, n, input);
请注意,不需要while
循环。但是,就我的真实意图而言,这将是我的一个猜测。
答案 1 :(得分:1)
您使用以下内容破坏了malloc()
ed ptr
fread(&ptr, 1, 1, input); /* overwrite the content of ptr */
所以程序在尝试使用ptr
时会崩溃。
使用:
fread(ptr, 1, 1, input);
或更好:没有while循环,并使用:
fread(ptr, 1, n, inout);
答案 2 :(得分:1)
正如其他人指出的那样,ptr在这个区块中没有增加,
while ( n-- != 0 )
{
fread(&ptr, 1, 1, input); // FIXME, ptr not incremented
}
但是你正在尝试将1字节数据存储为整数;这是你想要的吗?