我有这段代码,它最初读取一个 .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 循环中,程序运行良好,我可以在文件中看到输出。我需要将这些值存储在数组中,以便进一步计算。可能是什么错误?
最佳答案
代码看起来不错。您可以做的是检查 fseek
和 fread
的结果,以确认它们按预期工作。至于 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;
}
此解决方案通过不使用它们来避免关于 fseek
、ftell
、etc 是否正常工作的任何不确定性,并检查更多错误,因此如果它在您的测试用例中失败,您可能会知道发生了什么。希望这会有所帮助。
关于c - 在 C 中创建大小在运行时决定的数组时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188289/