在C中创建数组时出错,其大小是在运行时决定的

时间:2017-02-12 13:44:27

标签: c arrays error-handling runtime

我有这个代码,它最初读取.wav文件以找出其中的样本数。使用这个大小我试图制作那个大小的数组。之后,我正在从同一个.wav文件中读取样本并存储在该数组中,但是在762880个样本中,它只读取了7500个样本(大约)。

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<stdlib.h>

void main(){
    FILE *fp;
    long n,i=0;
    float *data;
    FILE* inp =NULL;
    FILE* oup =NULL;
    float value =0;
    signed short ss;
      /* Open file */
    fp = fopen("k1s1.wav", "rb");
    fseek(fp, 0L, SEEK_END);
    n = ftell(fp);
    n=n/2-22;
    printf("n:%ld",n);
    fclose(fp);


    data=malloc(n*sizeof(float));


    inp = fopen("k1s1.wav","rb");
    oup = fopen("cs123.txt","wt");
    fseek (inp,44,SEEK_SET);// that didn't help getting the right result !!

    i=0;
    for(i=0;i<n;i++){
        fread(&ss, sizeof(signed short) ,1 , inp);
        //Now we have to convert from signed short to float:
        value=((float)ss)/(unsigned)0xFFFF;
        value= value* 2.0;
        value= value*100000;
        value= ceil(value);
        value= value/100000;
        fprintf(oup,"%f\n",value);
        data[i]=value;
        ///printf("%lf\t",value);

    }

    fclose(inp);
    fclose(oup);
    printf("done");

}

当我删除此行时 - “data [i] = value;”在for循环中程序工作正常,我可以看到文件中的输出。我需要将这些值存储在数组中以便进一步计算。可能是什么错误?

1 个答案:

答案 0 :(得分:0)

代码看起来还不错。您可以执行的操作是检查fseekfread的结果,以确认它们按预期工作。对于fseek,从技术上讲,它应该传递ftell的结果而不传递计算的东西(但可能正确!)。

我在TurboC的评论中看到了。如果是这种情况,请确保使用&#34;小代码&amp;大数据&#34 ;.如果您使用&#34;小代码&amp;小数据&#34;,你可能会遇到像你这样的大量数据。

我可能会写这样的东西:

#include <stdlib.h>
#include <stdio.h>

#define HEADER        22
#define INCREMENT     10000
#define CONVERSION    (2.0 / 65535.0)

int main() {
    FILE *inp = NULL, *oup = NULL;
    float *data = NULL, value;
    signed short header[HEADER], ss;
    long i = 0, j = 0;

    if ((inp = fopen("k1s1.wav", "rb")) && (oup = fopen("cs123.txt","wt"))) {
        if (fread(header, sizeof(header), 1, inp)) {
            while (fread(&ss, sizeof(signed short), 1, inp)) {
                value = ((float)ss) * CONVERSION;
                if (j == i) {
                    j += INCREMENT;
                    if (!(data = realloc(data, j * sizeof(float)))) {
                        fprintf(stderr, "FAILURE: realloc failure at %ld elements\n", j);
                        return EXIT_FAILURE;
                    }
                }
                data[i++] = value;
                fprintf(oup,"%.5f\n",value);
            }
            /* Release any extra memory */
            j = i;
            if (!(data = realloc(data, j * sizeof(float)))) {
                fprintf(stderr, "FAILURE: realloc failure at %ld elements\n", j);
                return EXIT_FAILURE;
            }
            for (i = 0; i < j; i++) {
                /* Can analyze data here */
            }
        } else {
            fprintf(stderr, "FAILURE: header not defined\n");
            return EXIT_FAILURE;
        }
    } else {
        fprintf(stderr, "FAILURE: files could not be opened\n");
        return EXIT_FAILURE;
    }

    /* Okay to use if the arguments are NULL */
    free(data);
    fclose(inp);
    fclose(oup);

    return EXIT_SUCCESS;
}

此解决方案避免了fseekftell是否正常工作的不确定性,并且不使用它们,并检查更多错误,以便您可以如果你的测试用例失败了会怎么样?希望这会有所帮助。