fwrite二进制文件

时间:2017-10-15 08:35:11

标签: c matrix fwrite

我正在尝试创建一个在二进制文件中写入矩阵的程序。前两项是矩阵的行和列,然后是其余的值。 矩阵的数据是浮点数(当它全部以整数形式存在时,它起作用,但是当我将值更改为浮点数时它停止工作)。

下一段代码是在二进制文件中写入矩阵的方法。它是一切崩溃的部分。 Matrix定义是下一个:

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

typedef struct Matriz_t {
    int numFilas;
    int numColumnas;    
    float** datos;
}Matriz_t;
//create matrix
Matriz_t* crearMatriz(int numFilas, int numColumnas)
{

    Matriz_t* nMatriz = NULL;
    int i = 0;
    nMatriz = (Matriz_t*)malloc(sizeof(Matriz_t));
    nMatriz->numColumnas = numColumnas;
    nMatriz->numFilas = numFilas;

    nMatriz->datos = (float**)malloc(sizeof(float*)*numFilas);
    for (i = 0; i < numColumnas; i++) {
        nMatriz->datos[i] = (float*)malloc(sizeof(float)*numColumnas);
    }
    return nMatriz;
}
//read matrix
void leerMatriz(char * nomFichero, Matriz_t ** m1, int traspuesta)
{
    FILE* f1 = NULL;
    int i, j;
    int numFilas = 0, numColumnas = 0;

    f1 = fopen(nomFichero, "r");


    fread(&(numFilas), sizeof(int), 1, f1); . 
    fread(&(numColumnas), sizeof(int), 1, f1);
    (*m1) = crearMatriz(numFilas, numColumnas);
    if (traspuesta) {

        for (i = 0; i < (*m1)->numFilas; i++)
            for (j = 0; j<(*m1)->numColumnas; j++)
                fread(&((*m1)->datos[j][i]), sizeof(float), 1, f1);

    }
    else {
        for (i = 0; i < (*m1)->numFilas; i++)
            fread((*m1)->datos[i], sizeof(float), (*m1)->numColumnas, f1);
    }
    fclose(f1);
}

//write matrix
void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
{
    FILE* f1 = NULL;
    int i, j;


    f1 = fopen(nomFichero, "w");
    fwrite(&(m1->numFilas), sizeof(int), 1, f1); 
    fwrite(&(m1->numColumnas), sizeof(int), 1, f1);
    if (traspuesta) {
        for (i = 0; i < m1->numFilas; i++)
            for (j = 0; j < m1->numColumnas; j++)
                fwrite(&(m1->datos[j][i]), sizeof(float), 1, f1);
    }
    else {
        for (i = 0; i < m1->numFilas; i++)
            fwrite(m1->datos[i], sizeof(float), m1->numColumnas, f1);
    }
    fclose(f1);
}
//main
int main()
{
    int i = 0, j = 0;
        Matriz_t *m1, *m2, *mres;

        m1 = crearMatriz(4, 4);
        m2 = crearMatriz(4, 4);
        for (i = 0; i < 4; i++)
            for (j = 0; j < 4; j++) {
                m1->datos[i][j] = j;
                m2->datos[i][j] = i;
            }
        printf("\n Matriz 1: \n");
        printf("%d y %d ", m1->numFilas, m1->numColumnas);
        for (i = 0; i < 4; i++) {
            printf("\n");
            for (j = 0; j < 4; j++) {
                printf("%f ", m1->datos[i][j]);
            }
        }
        printf("\n Matriz 2: \n");
        for (i = 0; i < 4; i++) {
            printf("\n");
            for (j = 0; j < 4; j++) {
                printf("%f ", m2->datos[i][j]);
            }
        }

        escribirMatriz("matriz3.bin", &m1, 1);
        escribirMatriz("matriz4.bin", &m2, 1);

        //leer matriz
        leerMatriz("matriz3.bin", &m1, 0);
        leerMatriz("matriz4.bin", &m2, 0);

更改最后一个号码&#34; traspuesta&#34; (转动cols和行)到所有11可能有效,但由于cols和row的数量不正确,它不能相乘(而且这种方法是正确的,但无论如何,在所有的东西中都应该有0&#39; s )。

然后我做一个简单的if来检查我是否可以乘以这些矩阵(M1 nxm和M2 ixj,可以乘以if m==i,但作为写法不起作用,它永远不会倍增。

1 个答案:

答案 0 :(得分:3)

function toHttps(link) { 
  var url = document.createElement('a');
  url.href = link;
  url.protocol = 'https';
  return url.href;
}

这是不正确的,在这个千年中制作的任何编译器都应该至少警告过你。

escribirMatriz("matriz3.bin", &m1, 1);