2010-12-05 78 views
0

Je suis heureux de rejoindre votre forum. Maintenant, allons à la baisse; Im ayant des problèmes avec une erreur «erreur de segmentation». Im lire des données à partir d'un fichier binaire, que Im essayant de stocker dans une structure; Voici le code de ce que je fais ou «essaie» de faire. hahahaAide pour la structure (erreur de segmentation)

struct Medico //users are medics 
{ 
    int Id_Doctor; //Id User 
    int Estado; //status of the user 
    char Nombre[60]; //name of the user 
    char Clave_Acceso[20]; //password of the user 
    char Especialidad[40]; //especialty of the user 
    struct Medico *next; 
}; 

void Cargar_Datos() //load files 
{ 
    FILE *Archivaldo; ///file- Archivo means file 
    struct Medico * head = NULL; 
    struct Medico * prev, *current; 
    char especialida[40], password[20]; ///locals for specialty and password 
    char nombre_doc[60]; ///local for name 
    int estado_doc, id_doc; // local for status 

    if((Archivaldo=fopen("md.dat", "a+b"))==NULL) 
    { 
     printf("No se pudo abrir el archivo de Medicos\n"); 
     exit(1); 
    } 
    rewind(Archivaldo); 
    current = (struct Medico *) malloc (sizeof(struct Medico)); 

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

    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"); 
    current->Id_Doctor=id_doc; 
    strcpy(current->Nombre, nombre_doc); 
    strcpy(current->Clave_Acceso, password); 
    strcpy(current->Especialidad, especialida); 
    current->Estado=estado_doc; 
    current=current->next; 

    fclose(Archivaldo); 

} 

Merci à l'avance. Passez une bonne journée

+0

Veuillez reformater votre message afin que le code soit correctement indenté. En ce moment, c'est illisible. – thkala

+0

Veuillez également essayer de réduire vos exemples au plus petit morceau de code qui reproduira le bogue (c'est une bonne technique de débogage dans tous les cas). Et spécifiez exactement où la segfault se passe (trouvez ceci en l'exécutant dans un débogueur). –

+0

@Reese: merci. Maintenant, ce qui nous manque est le reste du programme ... – thkala

Répondre

0

La meilleure façon de déboguer une erreur de segmentation est d'utiliser un débogueur tel que GDB ou un analyseur de mémoire tels que Valgrind.

Si ce n'est pas disponible, il est généralement utile d'ajouter des instructions printf() numérotées dans le code. Lorsque vous trouvez le dernier printf() qui a été exécuté avant l'erreur, vous pouvez ajouter d'autres instructions printf() et répéter vos tests pour le réduire.

Quelques causes communes d'une erreur de segmentation dans le programme C:

  • Essayant de déréférencer un pointeur NULL. Cela arrive souvent si le pointeur est le résultat d'un appel de fonction tel que malloc() ou fopen(), dont la sortie n'a pas été vérifiée avant de continuer.

  • Dépasser les limites d'un tableau ou d'un bloc alloué. Les chaînes qui ne sont pas terminées par des valeurs nulles sont une cause fréquente de cela. Si l'impression d'une chaîne produit des déchets à l'écran, cela peut être la cause.

  • Essayer d'utiliser un bloc de mémoire qui a déjà été libéré avec free().

3

Vous lisez nombre_doc, especialida et toutes les autres chaînes avec fread. C'est bien mais cela ne termine pas les chaînes avec un caractère '\0'. Vous utilisez puts et strcpy qui attendent que ces chaînes se terminent avec le terminateur nul.

D'abord, augmenter la taille des cordes avec 1. Après cette fin à vos cordes:

nombre_doc[60] = '\0'; 
+0

Euh qui dépassera la fin du tableau. Vous vouliez 59 pas 60. –

+0

C'est pourquoi j'ai dit qu'il faudrait augmenter la taille de la corde avec un. Je suppose qu'il a des champs de largeur fixe dans le fichier. – terminus

+0

Donc vous avez fait. Je lisais trop vite. –