1

输入文件是in.wav. 我必须读取块(成功)并读取样本以标准化音频文件......

问题是它在尝试查找 .wav 文件样本的maxmin值时崩溃。它只会找到数组中的最小值和最大值,但它会崩溃......请告诉我出了什么问题。

这是代码:

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

更新:

尤里卡!这都是因为每个样本 8 位!我必须像处理一种字符一样使用它们(使用样本)。(请参阅代码中的“### UPDATE ###”-注释)

4

3 回答 3

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不需要循环。但是,这将是我对你真实意图的猜测。

于 2013-05-09T18:46:58.133 回答
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);
于 2013-05-09T18:48:13.483 回答
1

正如其他人指出的那样, ptr 在这个块中没有增加,

while ( n-- != 0 )
{
    fread(&ptr, 1, 1, input);  // FIXME, ptr not incremented 
}

但是您正在尝试将 1 字节数据存储为整数;这是你的意图吗?

于 2013-05-09T18:59:29.003 回答