2010-12-08 49 views
2

Je suis en cours d'exécution d'un programme avec 3 structures et ce que je fais en lecture/écriture dans le fichier binaire est le suivant:lecture/écriture d'une structure dans un fichier binaire

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); 

Est-il possible de le faire simplifier cela?

EDIT: De plus, lorsque j'essaie d'afficher les fichiers, quelqu'un m'a mentionné de ne pas utiliser feof pendant la lecture/écriture. Je ne me souviens pas pourquoi. Qu'est-ce qui pourrait être utilisé à la place?

+0

Veuillez mettre en forme le code. – loxxy

+1

Veuillez marquer vos questions à l'avenir avec la langue que vous utilisez. Je l'ai marqué avec C parce qu'il semble que vous n'utilisez que C. – birryree

+0

Je pensais que je l'ai fait, je suis tellement désolé; btw chaque fois que je semble formater le code lorsque je poste la question, il ne semble pas être sur le format .. – drodri420

Répondre

26

Je suppose que votre struct ressemble à ceci:

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

Vous pouvez lire/écrire/copier ce type autour comme une seule unité. Il n'est pas nécessaire d'effectuer un accès fragmentaire tant que vous n'êtes pas prêt à utiliser les valeurs.

struct Medicazos m = {"Bob", "Password", "Feet", 123, 456}; 

FILE* f = fopen(...); 
fwrite(&m, sizeof(struct Medicazos), 1, f); 

Et même (mais en arrière) pour fread. (Au fait, vos noms de variables en majuscules me détruisent.)

+7

+1 pour la réponse propre et je voudrais pouvoir vous donner un +1 pour le dernier commentaire sur les noms de variables. –

+1

Je suppose que faire ce code ne prend pas en compte endianess? – GWW

+0

Je suis tellement désolé, je pensais que j'ai posté la structure, la structure est dans l'édition de la question – drodri420