【发布时间】:2015-01-16 19:50:01
【问题描述】:
我的指针有问题。我想用一个函数读取一个二进制文件,然后在主文件中使用读取的数据。问题是我必须传递一个指向结构数组的指针才能使用 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;
}
【问题讨论】:
-
英文的代码/cmets 通常会更容易阅读,但
leer_fichero中的pieza具有本地存储,您只需将一个地址放入您的数组中,该对象将是函数结束后超出范围。 -
这一行:'for(int i = 0; sizeof(vpiezas)/sizeof(struct fichpiezas); i++){' in main() 有问题。它永远不会退出 for 循环,因为计算总是相同的。建议:'for(int i = 0; i
-
这一行:'while (!feof(fich)){' 将无法按预期工作,因为 feof() 直到从 fich 文件读取操作后才定义。建议使用:'while ( fread (&pieza, sizeof(pieza), 1, fich) ) ' fread 将在成功时返回第三个参数,并且(在这种情况下)在失败/EOF 发生时返回 0。
-
这一行:'vpiezas[i] = &pieza;每次通过相同的地址。建议:'memcpy( &(vpiezas[i]), &pieza, sizeof(struct fichpiezas) ); ''
-
这一行:'int leer_fichero (struct fichpiezas *vpiezas[]){' 表示传递一个指针数组,而实际上只涉及一个指向结构数组的指针。建议:'int leer_fichero (struct fichpiezas *vpiezas){'