C 将随机矩阵写入文件,然后使用格式化 I/O 从文件中读取和复制所述矩阵

标签 c file matrix scanf

感谢我之前在这里得到的所有帮助。

在下面的程序中,我想创建一个随机矩阵,将其打印到屏幕上,将其写入文件,然后从文件中扫描该矩阵的副本并将副本打印到屏幕上,一切正常,除了何时我尝试从文件中读取,我认为我的代码中的算法不正确,

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 ;   
}

最佳答案

for ( i=0; i < m; i++ )
{
    for ( j=0; j < n; j++ )
    {
        fscanf(fptr, "  %5.2lf", &x );
        *ptr=x;
    }
}

虽然您的整个代码太长而无法阅读,但此部分肯定是错误的。您必须在某个时间递增指针,否则只会初始化第一个元素。尝试:

*ptr++ = x;

valgrind 是检测此类错误的好工具,当您访问(或打印,在您的情况下)未初始化的内存时,它会抛出错误。

关于C 将随机矩阵写入文件,然后使用格式化 I/O 从文件中读取和复制所述矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659426/

相关文章:

c - 在 C 文件中查找和替换

c++ - getopt加入参数

c - K&R的getc和putc实现对吗?

ruby - 如何检查文件是否存在

matlab - Matlab 中是否有 blockproc 的替代品?

Matlab:将单元格中的矩阵对角线附加到新的零矩阵中

powershell - 如何动态填充多维数组?

c# - 在 C# 中编码(marshal) C 数组

c - 没有成员的结构

c - 将一些数据写入文件后出现段错误