Проблема с чтением fscanf двумерного массива двойников из текстового файла

У меня возникли проблемы с использованием fscanf в C. Я записал случайную матрицу в файл и теперь пытаюсь прочитать данные из текстового файла в другую матрицу. Кажется, он отлично читает количество строк и столбцов, но возвращает нули для значений данных. Я полностью застрял, поэтому любая помощь будет оценена!

Моя структура 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);
 }

Спасибо!


person Cosmo S    schedule 09.01.2013    source источник


Ответы (2)


У вас есть несколько проблем, одна из них указана @simonc, другая возможная: вы перематываете после чтения столбцов и строк в файле

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 */
}
person David Ranieri    schedule 09.01.2013

Как указано Alter Mann, отбросьте второй

fscanf(filep,"\n\nrows = %u, columns = %u\n\n",&m,&n);

так же хорошо как

rewind(filep);

кроме того, " %5.2lf" не является действительной спецификацией преобразования scanf (вы можете прочитать об этом в руководстве) - вместо этого используйте "%lf".

person Armali    schedule 12.05.2014