Спасибо за всю помощь, которую я получил здесь раньше.
В приведенной ниже программе я хочу создать случайную матрицу, распечатать ее на экране, записать в файл, а затем отсканировать копию этогоматрица из файла и распечатать копию на экран, все работает, за исключением случаев, когда я пытаюсь прочитать из файла, алгоритм в моем коде является неправильным, я думаю,
функция scanf не работает, я не знаю, почему....
double *matrix_read(FILE *fptr, double *mat, int m, int n ) ;
double *matrix_read(FILE *fptr,double *mat, int m, int n ) {
int i,j;
double *ptr,x ;
ptr=mat;
if((fptr=fopen("matrixA.txt","r"))==NULL)
{
puts("Cannot Open File");
}
rewind(fptr);
fscanf( fptr,"\n\nrows %d, columns %d\n\n", &m, &n) ;
mat = (double *) malloc( sizeof( double ) * m * n ) ;
for ( i=0; i < m; i++ )
{
for ( j=0; j < n; j++ )
{
fscanf(fptr, " %5.2lf", &x );
*ptr++=x;
}
}
fclose(fptr);
return mat ;
}
В моем main
функции вызываются следующим образом:
rand_matrix(MATRIX.matrix, MATRIX.rows, MATRIX.cols ); /* populates matrix with random data */
print_matrix(MATRIX.matrix, MATRIX.rows, MATRIX.cols ) ; /* prints the matrix */
matrix_write( fptr, MATRIX.matrix, MATRIX.rows, MATRIX.cols ) ; /* writes matrix to file*/
_flushall();
getchar();
MATRIX1.matrix=matrix_read( fptr, MATRIX.matrix, MATRIX.rows, MATRIX.cols ) ; /* reads above matrix from file as a copy */
print_matrix(MATRIX1.matrix, MATRIX.rows, MATRIX.cols ) ; /* prints this copyed matrix*/
при печати скопированной матрицы я получаю кучу искаженных, массивных чисел (т.е. 1259000000000000000000) Я думаю, что это имена ячеек памяти или что-то, может кто-нибудь помочь мне исправить мою read_matrix()
функцию?
Большое спасибо.
Ниже приведен мой полный код (он компилируется).
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <malloc.h>
#include <conio.h>
double random() ;
double *rand_matrix( double *mat, int m, int n ) ;
void print_matrix( double *mat, int m, int n ) ;
void matrix_write(FILE *fptr, double *mat, int m, int n ) ;
double *matrix_read(FILE *fptr, double *mat, int m, int n ) ;
int main()
{
struct matrep {
unsigned rows,cols;
double *matrix;
} MATRIX,MATRIX1,MATRIX2;
int check = 0 ;
FILE *fptr;
printf( "\n\nMatrix Manipulations Program" );
do {
printf( "\n\nEnter matrix dimensions : rows x columns : " );
check = scanf( "%d x %d", &MATRIX.rows, &MATRIX.cols );
_flushall();
} while ( check != 2 || MATRIX.rows < 1 || MATRIX.cols < 1 ) ;
MATRIX.matrix = (double *) malloc( sizeof( double ) * MATRIX.rows * MATRIX.cols ) ;
if ( !MATRIX.matrix ){
printf( "\n\nSTOP : unable to allocate memory - exiting program") ;
exit( 1 ) ;
}
rand_matrix(MATRIX.matrix, MATRIX.rows, MATRIX.cols ); /* populates matrix with random data */
print_matrix(MATRIX.matrix, MATRIX.rows, MATRIX.cols ) ; /* prints the matrix */
matrix_write( fptr, MATRIX.matrix, MATRIX.rows, MATRIX.cols ) ; /* writes matrix to file*/
_flushall();
getchar();
MATRIX1.matrix=matrix_read( fptr, MATRIX.matrix, MATRIX.rows, MATRIX.cols ) ; /* reads above matrix from file as a copy */
print_matrix(MATRIX1.matrix, MATRIX.rows, MATRIX.cols ) ; /* prints this copyed matrix*/
_flushall();
getchar();
}
/***********************************************************/
double random()
{
static int seeded = 0;
double val ;
if ( !seeded )
{
srand( time(NULL) ) ;
seeded = 1;
}
val = ((double)rand())/ (double)RAND_MAX * 100.0 ;
return val ;
}
/***********************************************************/
double *rand_matrix( double *mat, int m, int n )
{
double *ptr ;
int i, j ;
ptr = mat ;
for ( i=0; i < m; i++ ){
for ( j=0; j < n; j++ ){
*ptr++ = random() ;
}
}
return mat ;
}
/***********************************************************/
void print_matrix( double *mat, int m, int n )
{
double *ptr ;
int i, j ;
if ( mat==0 || m==0 || n==0 )
{
printf("\n\nEmpty matrix" );
return ;
}
ptr = mat ;
printf( "\n\nrows %d, columns %d\n\n", m, n) ;
for ( i=0; i < m; i++ )
{
for ( j=0; j < n; j++ )
{
printf( "\t%5.2lf", *ptr++ );
}
printf( "\n" ) ;
}
}
/***********************************************************/
void matrix_write(FILE *fptr,double *mat, int m, int n ) {
int i,j;
if((fptr=fopen("matrixA.txt","w"))==NULL)
{
puts("Cannot Open File");
}
fprintf( fptr,"\n\nrows %d, columns %d\n\n", m, n) ;
for ( i=0; i < m; i++ )
{
for ( j=0; j < n; j++ )
{
fprintf(fptr, " %5.2lf", *mat++ );
}
fprintf(fptr, "\n" ) ;
}
fclose(fptr);
}
/***********************************************************/
double *matrix_read(FILE *fptr,double *mat, int m, int n ) {
int i,j;
double *ptr,x ;
ptr=mat;
if((fptr=fopen("matrixA.txt","r"))==NULL)
{
puts("Cannot Open File");
}
rewind(fptr);
fscanf( fptr,"\n\nrows %d, columns %d\n\n", &m, &n) ;
mat = (double *) malloc( sizeof( double ) * m * n ) ;
for ( i=0; i < m; i++ )
{
for ( j=0; j < n; j++ )
{
fscanf(fptr, " %5.2lf", &x );
*pt++r=x;
}
}
fclose(fptr);
return mat ;
}