我目前正在处理下面的C代码。我需要在while
之后访问fclose
循环之外的数组。似乎 blackfin ADSP 内核每次运行时都会崩溃。我将进一步需要它来执行FFT。请帮忙!
#include <stdlib.h>
#include <stdio.h>
#include <flt2fr.h>
#include <fract_math.h>
#include <math_bf.h>
#include <complex.h>
#include <filter.h>
int main()
{
int n = 1024;
long int dat1[n];
FILE *file1;
fract16 *m;
int i;
// file1 open and read the values
file1 = fopen("0.dat", "r");
if (file1 == NULL) {
printf("I couldn't open 0.dat for reading.\n");
exit(0);
}
while (!feof(file1)) {
fgets(dat1, n, file1);
m = malloc(sizeof(fract16) * n);
for (i = 0; i < n; i++) {
sscanf(dat1, "%f", &m[i]); //getting error here
}
}
fclose(file1);
printf("%lf\n", m);
return 0;
}
好的,谢谢大家纠正我的错误,但问题仍未得到解决。我可以打印内部的所有值,但在循环外它只打印数据集的最后一个值,有没有精确的解决方案呢?我用谷歌搜索了几个小时但还没有成功。 代码如下&gt;
#include <stdlib.h>
#include <stdio.h>
#include <flt2fr.h>
#include<fract_math.h>
#include <math_bf.h>
#include <complex.h>
#include <filter.h>
int main()
{
int n = 1024;
long int dat1[n];
FILE *file1;
fract16 *m;
file1 = fopen("0.dat", "r");
if (file1 == NULL) {
printf("I couldn't open 0.dat for reading.\n");
exit(0);
}
while( !feof(file1))
{
fgets(dat1,n,file1);
sscanf(dat1, "%f", &m);
printf("%f\n",m); //Prints all elements in the 1st column of the array, 0.dat is a nx2 matrix
}
fclose(file1);
}
答案 0 :(得分:1)
在while循环之外,您可以在读取文件之前为缓冲区分配内存。然后每次在读入缓冲区之前,只需使用memset并将缓冲区设置为所有空字符。
另外,尝试使用fread直接读入缓冲区而不是fgets
答案 1 :(得分:0)
变量m
被定义为fract16
解决问题建议:
if( 1 != sscanf(dat1, "%f", m+(sizeof(fract16)*i) )
{
perror( "sscanf failed" );
exit( EXIT_FAILURE );
}
错误正在导致,因为m
已经是指针,并且您希望它继续作为指针
暂且不说。代码不会检查在调用fgets()
时实际读取了多少数据,因此for()
很可能正在读取实际数据的末尾。通过while()
循环的每次旅行都会破坏/覆盖从之前调用malloc()
然后在代码中是声明:
printf("%lf\n", m);
但是m
是一个指向`fract16对象数组的指针。
和那些fract16
个对象可能是double
个值,但这个细节并不清楚。在任何情况下,对printf()
的这种调用最多只会从输入文件中最后一行的开头输出一个double值。那是你真正想做的吗?
注意:dat1[]
被声明为long int
的数组,但对sscanf()
的调用似乎是在试图提取float
值。
即。代码与数据类型不一致,也不是单个值的提取,也不是打印。
有一点需要注意:使用当前代码会导致大量内存泄漏,因为m
的调用会反复覆盖指针malloc()
并且由于使用了feof()
,对fgets()
的最后一次调用将失败,因此dat1[]
的cotents将以NUL字节开头
建议分配一个指向fractl16
个对象的指针数组
然后对于每一行读取,使用malloc()
设置指针数组中的下一个指针,...