fscanf从文本文件中读取二维数组的问题

时间:2013-01-09 13:47:12

标签: c file matrix scanf

我在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);
 }

谢谢!

2 个答案:

答案 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"