输出和输入二进制数据C.

时间:2012-01-08 19:23:31

标签: c file-io matrix binary-data

我正在尝试输出并输入二维数组的二维数组。

我的二维数组包含在以下结构中

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输入。

有人可以帮我解决问题吗?

1 个答案:

答案 0 :(得分: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);
}