fwrite 二进制文件中不正确的值赋值写入矩阵
fwrite incorrect value assignment writing matrixes in a binary file
我正在尝试制作一个在二进制文件中写入矩阵的程序。前两项是矩阵的行和列,然后是其余的值。
矩阵的数据是浮点数(当它都是整数时,它有效,但是当我将值更改为浮点数时它停止工作)。
下一段代码是将矩阵写入二进制文件的方法。这是一切崩溃的部分。
下一个是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);
将最后一个数字 "traspuesta"(将 cols 和 rows)更改为全部 1 1 可能会起作用,但由于 cols 和 rows 的数量不正确,因此无法相乘(而且该方法是正确的,但无论如何,一切都为 0 应该没问题)。
然后我做了一个简单的 if
来检查我是否可以将这些矩阵相乘(M1 nxm
和 M2 ixj
,可以相乘 if m==i
,但是作为写法不行,永远不会倍增。
escribirMatriz("matriz3.bin", &m1, 1);
这是不正确的,本世纪制造的任何编译器至少应该警告过你。
mtrx.c:102:39: warning: passing argument 2 of ‘escribirMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
escribirMatriz("matriz3.bin", &m1, 1);
^
mtrx.c:53:6: note: expected ‘Matriz_t * {aka struct Matriz_t *}’ but argument is of type ‘Matriz_t ** {aka struct Matriz_t **}’
void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
^~~~~~~~~~~~~~
mtrx.c:103:39: warning: passing argument 2 of ‘escribirMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
escribirMatriz("matriz4.bin", &m2, 1);
^
mtrx.c:53:6: note: expected ‘Matriz_t * {aka struct Matriz_t *}’ but argument is of type ‘Matriz_t ** {aka struct Matriz_t **}’
void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
^~~~~~~~~~~~~~
我正在尝试制作一个在二进制文件中写入矩阵的程序。前两项是矩阵的行和列,然后是其余的值。 矩阵的数据是浮点数(当它都是整数时,它有效,但是当我将值更改为浮点数时它停止工作)。
下一段代码是将矩阵写入二进制文件的方法。这是一切崩溃的部分。 下一个是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);
将最后一个数字 "traspuesta"(将 cols 和 rows)更改为全部 1 1 可能会起作用,但由于 cols 和 rows 的数量不正确,因此无法相乘(而且该方法是正确的,但无论如何,一切都为 0 应该没问题)。
然后我做了一个简单的 if
来检查我是否可以将这些矩阵相乘(M1 nxm
和 M2 ixj
,可以相乘 if m==i
,但是作为写法不行,永远不会倍增。
escribirMatriz("matriz3.bin", &m1, 1);
这是不正确的,本世纪制造的任何编译器至少应该警告过你。
mtrx.c:102:39: warning: passing argument 2 of ‘escribirMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
escribirMatriz("matriz3.bin", &m1, 1);
^
mtrx.c:53:6: note: expected ‘Matriz_t * {aka struct Matriz_t *}’ but argument is of type ‘Matriz_t ** {aka struct Matriz_t **}’
void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
^~~~~~~~~~~~~~
mtrx.c:103:39: warning: passing argument 2 of ‘escribirMatriz’ from incompatible pointer type [-Wincompatible-pointer-types]
escribirMatriz("matriz4.bin", &m2, 1);
^
mtrx.c:53:6: note: expected ‘Matriz_t * {aka struct Matriz_t *}’ but argument is of type ‘Matriz_t ** {aka struct Matriz_t **}’
void escribirMatriz(char * nomFichero, Matriz_t * m1, int traspuesta)
^~~~~~~~~~~~~~