我的指针有问题。我想读一个带有函数的二进制文件,然后使用main中的读取数据。问题是我必须传递一个指向struct数组的指针才能使用main中的数据。
代码是:
#define TMOLDEO 8
#define TAM 41
struct fichpiezas{
int codPieza;
float dimPieza;
float costePieza[TMOLDEO];
};
int leer_fichero(struct fichpiezas *vpiezas[]);
int main(int argc, const char * argv[]) {
struct fichpiezas vpiezas[TAM];
leer_fichero(&vpiezas);
for(int i = 0; sizeof(vpiezas)/sizeof(struct fichpiezas); i++){
printf("Codigo pieza : %d\n", vpiezas[i].codPieza);
}
return 0;
}
int leer_fichero (struct fichpiezas *vpiezas[]){
FILE *fich;
struct fichpiezas pieza;
int error_dev = 0, i = 0;
if ((fich = fopen("piezas.bin", "rb")) == NULL){
printf ( "Error en apertura del fichero para lectura \n " );
error_dev = 1;
} else{
//Bucle mientras no sea fin de fichero
while (! feof(fich)){
fread (&pieza, sizeof(pieza), 1, fich);
vpiezas[i] = &pieza;
i++;
}
fclose (fich);
}
return error_dev;
}
答案 0 :(得分:4)
只需更改此
int leer_fichero (struct fichpiezas *vpiezas[])
到
int leer_fichero (struct fichpiezas *vpiezas)
并在main()
leer_fichero(&vpiezas);
到
leer_fichero(vpiezas);
当传递给函数时,数组将自动衰减为指针。所以你不需要将它的地址传递给函数。
您还有另一个问题,即此作业
vpiezas[i] = &pieza;
是一个问题,因为您在数组中存储了局部变量pieza
的地址,并且当此函数返回时数据将消失。
另外,pieza
的值在每次迭代bu fread()
中都会被覆盖,因为您存储pieza
的地址而不是它的值,所有元素都是如果以这种方式成功,数组将具有相同的值。
你需要将结构复制到数组元素中,如果你遵循我的建议,这一行应改为
vpiezas[i] = pieza;
或程序将无法编译,因为在更改函数原型后,&pieza
的类型为struct fichpiezas *
而vpiezas[i]
的类型现为struct fichpiezas
。
此外,大约while (! feof(fich))
还有一个answer,详细解释了为什么这是错误的。
还有一件事,添加一个支票i < TAM
,因为否则你有可能会溢出数组。
Nota :Espero ser de ayuda。
答案 1 :(得分:3)
这个
int leer_fichero(struct fichpiezas * vpiezas[]);
将vpiezas
定义为指向struct fichpiezas
指针的指针,如
int leer_fichero(struct fichpiezas * vpiezas[]);
相当于
int leer_fichero(struct fichpiezas ** vpiezas);
通过执行
来解决传递的数组元素leer_fichero(&vpiezas);
喜欢这个
(*vpiezas)[index]
在leer_fichero()
内。
定义
会更直接int leer_fichero(struct fichpiezas * vpiezas);
并传递
leer_fichero(vpiezas);
然后您可以像以下一样处理元素:
vpiezas[index]