2012-01-08 48 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