我在C中使用fscanf时遇到了一些麻烦。我已经在文件中写了一个随机矩阵,现在我正在尝试将文本文件中的数据读入另一个矩阵。它似乎可以很好地读取行数和列数,但它会为数据值返回零。我完全陷入困境,所以任何帮助都会受到赞赏!
我的MATRIX结构被声明为
typedef struct matrep {
unsigned rows, columns;
double *data;
}MATRIX;
我的文件如下:
rows = 5, columns = 10
-99.75 12.72 -61.34 61.75 17.00 -4.03 -29.94 79.19 64.57 49.32
-65.18 71.79 42.10 2.71 -39.20 -97.00 -81.72 -27.11 -70.54 -66.82
97.71 -10.86 -76.18 -99.07 -98.22 -24.42 6.33 14.24 20.35 21.43
-66.75 32.61 -9.84 -29.58 -88.59 21.54 56.66 60.52 3.98 -39.61
75.19 45.34 91.18 85.14 7.87 -71.53 -7.58 -52.93 72.45 -58.08
这是我的matrix_read
功能:
MATRIX matrix_read(char file_name[15])
{
int i,j, m, n;
MATRIX B;
FILE *filep;
double *ptr = NULL;
double x;
if((filep = fopen("matrixA.txt", "r"))==NULL)
{
printf("\nFailed to open File.\n");
}
if(fscanf(filep, "\n\nrows = %u, columns = %u\n\n", &m, &n) != 2)
{
printf( "Failed to read dimensions\n");
B.data = 0;
B.columns = 0;
B.rows = 0;
}
B.data = (double *)malloc(B.columns*B.rows*sizeof(double));
if(B.data ==0)
{
printf("Failed to allocate memory");
}
fscanf(filep,"\n\nrows = %u, columns = %u\n\n",&m,&n);
rewind(filep);
ptr = B.data;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (fscanf(filep, " %5.2lf", &x) != 1)
{
printf("Failed to read element [ %d,%d ]\n", i, j);
B.data = 0;
B.columns = 0;
B.rows = 0;
}
printf("%5.2lf\t", x);
*ptr++ = x;
}
}
B.rows=m;
B.columns=n;
return B;
fclose(filep);
free(ptr);
}
谢谢!
答案 0 :(得分:1)
你有几个问题,其中一个是@simonc指出的,另一个可能是: 你在阅读filep中的列和行后回放
rewind()
将与流关联的位置指示符设置为文件的开头,您再次阅读rows = 5, columns = 10
最后:
B.data = (double *)malloc(B.columns*B.rows*sizeof(double)); /* Don't cast malloc */
if(B.data ==0)
{
printf("Failed to allocate memory");
/* You have to return or exit here */
}
答案 1 :(得分:0)
如Alter Mann所示,请删除第二个
fscanf(filep,"\n\nrows = %u, columns = %u\n\n",&m,&n);
以及
rewind(filep);
此外," %5.2lf"
不是有效的scanf转换规范(您可以阅读有关此内容的手册) - 请改用"%lf"
。