我有这个代码,它最初读取.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循环中程序工作正常,我可以看到文件中的输出。我需要将这些值存储在数组中以便进一步计算。可能是什么错误?
答案 0 :(得分:0)
代码看起来还不错。您可以执行的操作是检查fseek
和fread
的结果,以确认它们按预期工作。对于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;
}
此解决方案避免了fseek
,ftell
,等是否正常工作的不确定性,并且不使用它们,并检查更多错误,以便您可以如果你的测试用例失败了会怎么样?希望这会有所帮助。