Матрица C fread (), считывающая из девяти неверных значений независимо от размера матрицы - PullRequest
0 голосов
/ 08 января 2012
void matrix_writebinary(struct matrep *mat) {
 int i,j;

FILE *fptr;
if((fptr=fopen("matrixA.bin","wb"))==NULL)
{
puts("Cannot Open File");
}

fwrite(&mat->rows,sizeof(int),1,fptr);
fwrite(&mat->cols,sizeof(int),1,fptr);
fwrite(mat->matrix,sizeof(double),(mat->rows*mat->cols),fptr);

fclose(fptr);   
}
/***********************************************************/

double *matrix_readbinary(struct matrep *mat) {
int i,j;


FILE *fptr;
if((fptr=fopen("matrixA.bin","rb"))==NULL)
{
puts("Cannot Open File");
}

fread(&mat->rows,sizeof(int),1,fptr);
fread(&mat->cols,sizeof(int),1,fptr);

mat->matrix = (double *) malloc( sizeof( double ) * (mat->rows*mat->cols) ) ;
fread(mat->matrix,sizeof(double),(mat->rows*mat->cols),fptr);

fclose(fptr);  
return mat->matrix;
}

Я использую две вышеупомянутые функции для записи матрицы в двоичный файл, а затем считываю матрицу из файла, используя fread.

Затем я печатаю матрицу, но каждый разДа, первые 9 элементов матрицы равны нулю, независимо от размера mat.rows или mat.cols, всегда 9 пустых элементов или -1. # R при попытке печати, поэтому я думаю, что fread (val, sizeof(double), (mat-> row * mat-> cols), fptr);

читает в 9 плохих двойных чисел, но я понятия не имею, почему ...

В основном (), пользователь указывает размер строки и столбца и т. д.

Если кто-то может объяснить, почему я был бы очень признателен.

Вот функция, используемая для печати

void print_matrix( struct matrep *mat ) 
{
double *ptr ;
int i, j ;

ptr=mat->matrix;

if ( mat->matrix==0 || mat->rows==0 || mat->cols==0 )
   {
   printf("\n\nEmpty matrix" );
   return ;       
   }

printf( "\n\nrows %d, columns %d\n\n",  mat->rows,  mat->cols) ;
for ( i=0; i <  mat->rows; i++ )
    {
    for ( j=0; j <  mat->cols; j++ )
        {
        printf( "%5.2lf\t", *ptr++ );
        }
    printf( "\n" ) ;
}

}

и используемая структура ...

struct matrep {
  int rows,cols;
  double *matrix;
};
struct matrep MATRIX,MATRIX1;

код, который вызывает matrix_readbinary () в main ()

//BINARY WRITE/READ
printf("\nWriting binary data now...\n");
matrix_writebinary( &MATRIX ) ; 
_flushall();
getchar();
printf("\nReading binary data now...\n");
MATRIX1.matrix=matrix_readbinary(&MATRIX1 ) ; // reads above matrix from file as a copy 
if(MATRIX1.matrix!=NULL){
                        printf("\nPrinting read .bin...\n");
                        print_matrix(&MATRIX1 ) ; // prints this copyed matrix
                         }

Ответы [ 2 ]

1 голос
/ 09 января 2012

Я создал тестовое приложение под Windows с Visual Studio, используя ваш опубликованный код, и он работал нормально.

#include <stdio.h>
#include <tchar.h>
#include <string.h>
#include <stdlib.h>

struct matrep
{
  int rows,cols;
  double *matrix;
};

void matrix_writebinary(struct matrep *mat)
{
  int i,j;
  FILE *fptr;
  if((fptr=fopen("matrixA.bin","wb"))==NULL)
  {
    puts("Cannot Open File");
  }
  fwrite(&mat->rows,sizeof(int),1,fptr);
  fwrite(&mat->cols,sizeof(int),1,fptr);
  fwrite(mat->matrix,sizeof(double),(mat->rows*mat->cols),fptr);
  fclose(fptr);
}

/***********************************************************/
double *matrix_readbinary(struct matrep *mat)
{
  int i,j;
  FILE *fptr;
  if((fptr=fopen("matrixA.bin","rb"))==NULL)
  {
    puts("Cannot Open File");
  }
  fread(&mat->rows,sizeof(int),1,fptr);
  fread(&mat->cols,sizeof(int),1,fptr);
  mat->matrix = (double*) malloc(sizeof(double)*(mat->rows*mat->cols));
  fread(mat->matrix,sizeof(double),(mat->rows*mat->cols),fptr);
  fclose(fptr);
  return mat->matrix;
} 

void print_matrix( struct matrep *mat )
{
  double *ptr ;
  int i, j ;
  ptr=mat->matrix;
  if ( mat->matrix==0 || mat->rows==0 || mat->cols==0 )
  {
    printf("\n\nEmpty matrix" );
    return ;
  }
  printf( "\n\nrows %d, columns %d\n\n",  mat->rows,  mat->cols) ;
  for ( i=0; i <  mat->rows; i++ )
  {
    for ( j=0; j <  mat->cols; j++ )
    {
      printf( "%5.2lf\t", *ptr++ );
    }
    printf( "\n" ) ;
  }
}

struct matrep MATRIX,MATRIX1;

int _tmain(int argc, _TCHAR* argv[])
{
  int  r;
  int c;
  double*  pdbl;

  MATRIX.rows = 4;
  MATRIX.cols = 3;
  pdbl = (double*) malloc(sizeof(double) * MATRIX.rows * MATRIX.cols);
  MATRIX.matrix = pdbl;
  for ( r = 0; r < MATRIX.rows; ++r )
  {
    for ( c = 0; c < MATRIX.cols; ++c )
    {
      *pdbl++ = c + r;
    }
  }
  matrix_writebinary(&MATRIX);
  print_matrix(&MATRIX);
  matrix_readbinary(&MATRIX1);
  print_matrix(&MATRIX1);
}
1 голос
/ 08 января 2012
double *val=mat->matrix;
...
val = (double *) malloc( sizeof( double ) * (mat->rows*mat->cols) ) ;
fread(val,sizeof(double),(mat->rows*mat->cols),fptr);

Сначала вы установили val на mat->matrix (я полагаю, нежелательная), а затем сбросили его до возвращаемого значения malloc(). Вы никогда не устанавливаете mat->matrix на что-либо.

...