2017-08-17 72 views
1

文件我用C寫了這個功能:閱讀(轉換)矩陣上用C

void fill_matrix(double **m, int r, int c, char *file) { 
    int i, j; 
    FILE *temp_file = fopen(file, "r"); 
    for (i = 0; i < r; i++) { 
     for (j = 0; j < c; j++) { 
      fscanf(temp_file, "%lf", &m[i][j]); 
     } 
    } 
    fclose(temp_file); 
} 

矩陣的定義,並以這種方式進行分配:

double **m; 
m = (double **)malloc(r * sizeof(double *)); 
for (i = 0; i < r; i++) 
    m[i] = (double *)malloc(c * sizeof(double)); 

rc是數字行和列。

PARAMS是:

fill_matrix(m, r, c, filename); 

testin.txt文件,我有這樣的矩陣:

1 2 3 4 
5 6 7 8 
9 1 2 3 

但我的輸出是:

1.00 0.00 0.00 0.00 
5.00 6.00 0.00 0.00 
9.00 1.00 2.00 3.00 

能否請你讓我知道如何解決這個問題?謝謝你的時間。

+1

爲什麼你讀它作爲雙打? –

+4

什麼是'm'?什麼是值或'r'和'c'?你怎麼稱呼這個功能?你如何打印這些值?你可以試着創建一個[最小,***完整***和可驗證示例](http://stackoverflow.com/help/mcve)並向我們展示? –

+0

m是te矩陣,r是行數,c是列數。我打電話給這個函數:'fill_matrix(matrix,rows,columns,argv [1]);' 要打印這些值:'fprintf(temp_file,「%lf」,m [i] [j] );' –

回答

0

您的功能create_matrix應該返回m而不是將其作爲參數。

由於編碼,功能create_matrix做分配,但指針是一個本地變量,並在函數返回時丟失。

您還應該檢查fscanf()malloc()的返回值,以正確檢測並處理故障。

您還應該在使用後釋放分配的對象。

這裏是你的代碼的修正版本:

的main.c:

#include <stdio.h> 
#include "library.h" 

int main(void) { 
    int rows, columns; 

    // Take the order matrix 
    printf("Number of rows: "); 
    if (scanf("%d", &rows) != 1) 
     return 1; 
    printf("Number of columns: "); 
    if (scanf("%d", &columns) != 1) 
     return 1; 

    matrix = create_matrix(rows, columns); 
    if (matrix != NULL) { 
     if (!fill_matrix(matrix, rows, columns, "testin.txt")) { 
      print_matrix(matrix, rows, columns, "testout.txt"); 
     } 
     free_matrix(matrix, rows, cols); 
    } 
    return 0; 
} 

library.h

double **create_matrix(int r, int c); 
void free_matrix(double **m, int r, int c); 
int fill_matrix(double **m, int r, int c, const char *file); 
int print_matrix(double **m, int r, int c, const char *file); 

LIBRARY.C

#include <stdio.h> 
#include <stdlib.h> 
#include "library.h" 

double **create_matrix(int r, int c) { 
    int i; 
    double **m = malloc(r * sizeof(*m)); 
    if (m != NULL) { 
     for (i = 0; i < r; i++) { 
      m[i] = malloc(c * sizeof(*m[i])); 
      if (m[i]) == NULL) { 
       while (i-- > 0) { 
        free(m[i]); 
       } 
       free(m); 
       return NULL; 
      } 
     } 
    } 
    return m; 
} 

void free_matrix(double **m, int r, int c) { 
    int i; 
    if (m) { 
     for (i = 0; i < r; i++) { 
      free(m[i]); 
     } 
     free(m); 
    } 
} 

int fill_matrix(double **m, int r, int c, const char *file) { 
    int i, j; 
    FILE *temp_file = fopen(file, "r"); 

    if (temp_file == NULL) 
     return -1; 

    for (i = 0; i < r; i++) { 
     for (j = 0; j < c; j++) { 
      if (fscanf(temp_file, "%lf", &m[i][j]) != 1) { 
       fclose(temp_file); 
       return -1; 
      } 
     } 
    } 
    fclose(temp_file); 
    return 0; 
} 

int print_matrix(double **m, int r, int c, const char *file) { 
    int i, j; 
    FILE *temp_file = fopen(file, "w"); 

    if (temp_file == NULL) 
     return -1; 

    for (i = 0; i < r; i++) { 
     for (j = 0; j < c; j++) { 
      fprintf(temp_file, "%f%c", m[i][j], " \n"[j == c - 1]); 
     } 
    } 
    fclose(temp_file); 
    return 0; 
} 
+0

您並不需要重新發布完整的代碼,只需更改您的設置即可。 –

+0

@Someprogrammerdude:我對發佈的每個函數都進行了更改。主要問題是'create_matrix()'中的API被破壞,但其餘代碼也需要更正。 – chqrlie

+0

然後指出你所做的所有更改是一個好主意。 –