读取/将结构写入二进制文件

我正在运行一个有3个结构的程序,我在二进制文件中读/写的操作如下:

struct Medico { int Id_Doctor; int Estado; char Nombre[60]; char Clave_Acceso[20]; char Especialidad[40]; struct Medico *next; }; typedef struct Medico *Medicazos; typedef struct Medico Meds; Medicazos Nuevo; FILE *Archivaldo; char especialida[40], password[20]; char nombre_doc[60]; int estado_doc, id_doc; Archivaldo=fopen("md.dat", "rb"); fclose(Archivaldo); if((Archivaldo=fopen("md.dat", "rb"))==NULL) { printf("No se pudo abrir el archivo de Medicos\n"); //couldnt open file msg exit(1); } rewind(Archivaldo); while(!feof(Archivaldo)) { if(*Inicio != NULL) //read from file and write in struct { Nuevo = (Medicazos) malloc (sizeof(Meds)); //new=pointer fread(&id_doc, sizeof(int), 1, Archivaldo); fread(nombre_doc, sizeof(char), sizeof(nombre_doc), Archivaldo); fread(password, sizeof(char), 20 , Archivaldo); fread(especialida, sizeof(char), 40, Archivaldo); fread(&estado_doc, sizeof(int), 1, Archivaldo); Nuevo->Id_Doctor=id_doc; ///copies data in structure strcpy(Nuevo -> Nombre , nombre_doc); strcpy(Nuevo -> Clave_Acceso, password); strcpy(Nuevo -> Especialidad, especialida); Nuevo-> Estado = estado_doc; printf("---------------------------------\n"); //display info printf("ID: %d\n", id_doc); printf("\nDoctor: "); puts(nombre_doc); printf("\nPassword: "); puts(password); printf("\nEspecialidad: "); puts(especialida); printf("\nEstado: "); if(estado_doc==1) puts("Activo\n"); else puts("Inactivo\n"); Nuevo-> next = *Inicio; *Inicio = Nuevo; } else { *Inicio = (Medicazos)malloc(sizeof(Meds)); fread(&id_doc, sizeof(int), 1, Archivaldo); fread(nombre_doc, sizeof(char), sizeof(nombre_doc), Archivaldo); fread(password, sizeof(char), 20 , Archivaldo); fread(especialida, sizeof(char), 40, Archivaldo); fread(&estado_doc, sizeof(int), 1, Archivaldo); (*Inicio)->Id_Doctor=id_doc; strcpy((*Inicio) -> Nombre , nombre_doc); strcpy((*Inicio) -> Clave_Acceso, password); strcpy((*Inicio) -> Especialidad, especialida); (*Inicio)-> Estado = estado_doc; printf("--------------------------------\n"); //display info printf("ID: %d\n", id_doc); printf("\nDoctor: "); puts(nombre_doc); printf("\nPassword: "); puts(password); printf("\nEspecialidad: "); puts(especialida); printf("\nEstado: "); if(estado_doc==1) puts("Activo\n"); else puts("Inactivo\n"); (*Inicio) -> next = NULL; } } fclose(Archivaldo); 

有没有办法简化这个?

编辑 :此外,当我尝试显示有人提到我的文件时,不要在阅读/写作时使用feof 。 我不记得为什么。 可以用什么呢?

我假设你的结构看起来像这样:

 struct Medicazos { char Nombre[60]; char Clave_Acceso[20]; char Especialidad[40]; int Id_Doctor; int Estado; } 

您可以将这个人作为一个单元进行读/写/复制。 在您准备好实际使用这些值之前,无需进行零碎访问。

 struct Medicazos m = {"Bob", "Password", "Feet", 123, 456}; FILE* f = fopen(...); fwrite(&m, sizeof(struct Medicazos), 1, f); 

对于fread同样(但落后)。

(顺便说一句,你的大写变量名称正在杀死我。)