2012-01-08 74 views
0

我想輸出並輸入二進制數組。輸出和輸入二進制數據C

我的二維陣列包含以下結構

typedef struct matrep { 
    unsigned rows, columns; 
    double *data; 
} MATRIX; 

內,我已經創建了下面的功能,以輸出整個結構

void matrix_writebinary(MATRIX *mat,FILE *fp)  
{ 
    int a=mat->rows,b=mat->columns; 
    fwrite(&a,sizeof(int),1,fp); 
    fwrite(&b,sizeof(int),1,fp); 
    fwrite(mat->data,sizeof(double) * a * b,1,fp); 
    rewind(fp); 
} 

和下面的函數來輸入結構

MATRIX *matrix_readbinary(MATRIX *mat,FILE *fp)  
{ 
    MATRIX matrix; 
    MATRIX *ptr; 
    ptr=&matrix; 
    int a,b; 

    double *tempptr=ptr->data; 
    fread(&a,sizeof(int),1,fp); 
    fread(&b,sizeof(int),1,fp); 

    for (int i=0; i < a; i++) 
    { 
     for (int j=0; j < b; j++) 
     { 
      double value=0.0;  
      fread(&value,sizeof(double),1,fp); 
      *(tempptr++)=value; 
     } 
    } 

    rewind(fp); 
    matrix.rows=a; 
    matrix.columns=b; 
    return(ptr); 
} 

我檢查過mat->rowsmat->columns一直都輸入並使用printf功能輸出正常,但是當它到達線

*(tempptr++)=value; 

在代碼中,我得到一個分段錯誤,告訴我,我困惑我的指針。 我不認爲問題在於打開關閉或操作函數外的文件,因爲我已經成功輸出文件並將其輸入到fprintf和fscanf中。

任何人都可以幫我理清我的指針嗎?

回答

4

您尚未爲數據分配任何內存。您需要添加分配:

ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns); 
double *tempptr = ptr->data; 

/* ... */ 

此外,您不得返回臨時地址!因此,基體本身需要進行動態分配,也:

MATRIX * ptr = malloc(sizeof(MATRIX)); 

你可以讀入&ptr->rows&ptr->columns直接,不需要中間變量。您還可以一次讀取所有數據。

全部放在一起:

MATRIX *matrix_readbinary(FILE * fp) 
{ 
    MATRIX * ptr = malloc(sizeof(MATRIX)); 

    fread(&ptr->rows, sizeof(unsigned int), 1, fp) 
    fread(&ptr->columns, sizeof(unsigned int), 1, fp) 

    ptr->data = malloc(sizeof(double) * ptr->rows * ptr->columns); 

    fread(ptr->data, sizeof(double), ptr->rows * ptr->columns, fp) 

    return ptr; 
} 

我不會推薦傳遞一個MATRIX指針,因爲這將要求您提供一些半生不熟的矩陣結構,而不分配數據存儲器,並且你會負責任的噩夢。

不要忘了相應的清理功能:

void matrix_free(MATRIX * mat) 
{ 
    free(mat->data); 
    free(mat); 
} 
+0

非常感謝您的回覆,你的意思是有道理的,我不知道,我還沒有分配的內存。然而,當我嘗試函數我得到2錯誤,「無效轉換從'void *'到'MATRIX *'」在行'MATRIX * ptr = malloc(sizeof(MATRIX));'和「無效轉換從'void *'到'double *'」在行ptr-> data = malloc(sizeof(double)* ptr-> rows * ptr-> columns); – Leavenotrace 2012-01-08 20:02:42

+0

我以爲你說你在寫C,你一定是在說謊,因爲你描述的是C++! :-)(清楚地說出你正在寫的是哪種語言是很重要的。在C++中,整個代碼很糟糕,我會做一些完全不同的事情。) – 2012-01-08 20:10:39

+0

真的很抱歉成爲一個痛苦,但做了修改後,程序仍然關閉,由於分段錯誤 – Leavenotrace 2012-01-08 20:12:59