c - 在 C 中创建大小在运行时决定的数组时出错

标签 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 循环中,程序运行良好,我可以在文件中看到输出。我需要将这些值存储在数组中,以便进一步计算。可能是什么错误?

最佳答案

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

我看到评论里提到了TurboC。如果是这种情况,请确保使用“小代码和大数据”进行构建。如果您使用“小代码和小数据”进行构建,您可能会遇到与大量数据类似的问题。

我可能会这样写:

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

此解决方案通过不使用它们来避免关于 fseekftelletc 是否正常工作的任何不确定性,并检查更多错误,因此如果它在您的测试用例中失败,您可能会知道发生了什么。希望这会有所帮助。

关于c - 在 C 中创建大小在运行时决定的数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188289/

相关文章:

C 中 int 转换为 char

c - 使用 libgd 在 C 中逐帧操作 gif

黑白棋游戏中的 C 指针

android - 如何在c4droid中使用sd2原语和sdl2_gfx

c - 按字母顺序对单词列表进行冒泡排序。我有一个指向每个单词的指针数组

c# - C#-是否可以使被零除返回一个数字,而不是引发异常?

c - 使用 minGW 将 FFTW 链接到 matlab

Javascript 递归错误

c# - 尽管存在错误 View ,但找不到错误页面 ASP.NET MVC

python - 为什么会出现IndexError : list index out of range