2016-02-05 100 views
-2

我正在尝试编写一个函数将文件中的数字读入二维矩阵; mm_alloc()函数是一个创建空矩阵的函数,并且该文件的第一行是矩阵的大小;但代码似乎无法从文件中读取,我的问题是什么?我错误地使用fgets()sscanf()将文件中的数字读入二维矩阵

double **mm_alloc(int size) 
{ 
    double **matrix; 
    int i; 
    matrix = (double **)malloc((size) * sizeof(double *)); 
    for (i = 0; i < size; i++) { 
     matrix[i] = (double *)malloc(size); 
    } 
    return(matrix); 
} 


double **mm_read(char *filename, int *size) 
{ 
    FILE *myfile; 
    myfile = fopen(filename, "r"); 
    char read[256]; 
    fgets(read, 256, myfile); 
    sscanf(read, "%d", size); 
    int i, j; 
    double **Matrix; 
    Matrix = mm_alloc(*size); 
    for (i = 0; i < *size; i++) { 
     for (j = 0; j < *size; j++) { 
      fgets(read, 256, myfile); 
      sscanf(read, "%lf", &Matrix[i][j]); 
     } 
    } 
    fclose (myfile); 
    return(Matrix); 
} 

void mm_free(int size, double **matrix ) 
{ 
    int i; 
    for (i = 0; i < size; i++) { 
     free(matrix[i]); 
    } 
    free(matrix); 
} 

void mm_print(int size, double **matrix) 
{ 
    int i, j; 
    for (i = 0; i < size; i++) { 
     for (j = 0; j < size; j++) { 
      printf("%16f", matrix[i][j]); 
     } 
     printf("\n"); 
    } 
} 

double **mm_swap(int size, double **matrix) 
{ 
    double **swap; 
    swap = mm_alloc(size); 
    int i, j; 
    for (i = 0; i < size; i++) { 
     for (j = 0; j < (size-2); j++) { 
      swap[i][j] = matrix[i][j+2]; 
      swap[i][j+2] = matrix[i][j]; 
     } 
    } 
    return(swap); 
} 

double **mm_matrix_mult(int size, double **matrix, double **transpose) 
{ 
    double **matrix_mult; 
    matrix_mult = mm_alloc(size); 
    int i, j, k; 
    double result; 
    for (i = 0; i < size; i++) { 
     for (j = 0; j < size; j++) { 
      result = 0; 
      for (k = 0; k < size; k++) { 
       result += (matrix[i][k] * transpose[k][j]); 
      } 
      matrix_mult[i][j] = result; 
     } 
    } 
    return(matrix_mult); 
} 

int main() 
{ 
    char filename[256]; 
    double **matrix=NULL; 
    double **swap_matrix=NULL; 
    double **results_matrix=NULL; 
    int size=0; 

    printf("Please enter the matrix data file name: "); 
    scanf("%s", filename); 

    matrix = mm_read(filename, &size); 
    swap_matrix = mm_swap(size, matrix); 
    results_matrix = mm_matrix_mult(size, matrix, swap_matrix); 

    mm_print(size, results_matrix); 
    mm_free(size, matrix); 
    mm_free(size, swap_matrix); 
    mm_free(size, results_matrix); 
    return(0); 
} 

文件内容:

4 
1.0 
2.0 
3.0 
4.0 
5.0 
6.0 
7.0 
8.0 
9.0 
10.0 
11.0 
12.0 
13.0 
14.0 
15.0 
16.0 
+2

** **务必检查所有I/O函数的返回值! – user694733

+1

“*但代码似乎无法从文件中读取*”您是从什么结论来的? – alk

+0

显示您阅读的文件的第一行。 –

回答

2

您与 “W” 打开该文件。

这将擦除文件。您需要打开“r”才能从文件中读取。

+0

无用,我已经改变它为“r”仍然不工作 –

1

您的分配函数分配给少量内存。

此行

matrix[i] = (double *)malloc(size); 

至少应该

matrix[i] = (double *)malloc(size * sizeof(double)); 

甚至更​​好删除此废铸件:

matrix[i] = malloc(size * sizeof(double)); 

而且配置功能完全错过了执行任何错误chec国王。 malloc()很可能会失败,具体取决于请求的内存大小。

下面请找一个安全的实现:

/* Allocates a pointer matrix to an array of size pointers 
    each pointing to size doubles. 

    Returns matrix or NULL on error. 
*/ 

double ** mm_alloc(size_t size) 
{ 
    double ** matrix = malloc(size * sizeof *matrix); 
    if (NULL != matrix) 
    { 
    for (size_t i = 0; i < size; ++i) 
    { 
     matrix[i] = malloc(size * sizeof *matrix[i]); 
     if (NULL == matrix[i]) 
     { /* Clean up. */ 
     while (0 < i) 
     { 
      --i; 
      free(matrix[i]); 
     } 

     free(matrix); 
     matrix = NULL; 

     break; 
     } 
    } 
    } 

    return matrix; 
} 
+0

我已经改变它,但它似乎仍然无法正常工作;我已经使用fscanf()而不是fgets()和sscanf(); fscanf()工作,但fgets()和sscanf()不。 –

+0

@HaotianSong:你想使用调试器去追踪代码。 – alk