IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

recupérer une liste chainée double à partir d'un fichier


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut recupérer une liste chainée double à partir d'un fichier
    Salut à tous,
    Tout d'avoir merci d'avoir pris le temps de lire mon problème.

    Voila, je veux lire un fichier où j'ai stocké une liste chaînée double, j'ai créer la fonction suivante mais à la fin ca retourn que le dernier élément!! et je ne vois pas d'où vient l'erreur.

    La structure de la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    typedef struct etudiant
    {
       struct etudiant *prec;
       struct etudiant *suiv;
       char nom[15];
       char prenom[15];
       int niveau;
       char adresse[30];
       char filiere[10];
       char tel[10];
    } etudiants;
     
    typedef struct dlist
    {
       size_t length;
       etudiants *p_head;
       etudiants *p_tail;
    }Dlist;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Dlist **recupfichier(etudiants *pers) //recuperation du fichier
    {
    	etudiants *nouvo, *tmp;
    	Dlist *l;
    	l=malloc(sizeof(Dlist));
    	FILE *fic; //variable type fichier
        char nom[15],prenom[15],filiere[15],adresse[30], tel[10];
        int niveau;
    	int cmpt=1;
     
    	if(!pers) //si la liste n'existe pas
    	{
    		pers = malloc(sizeof(etudiants));
            nouvo = malloc(sizeof(etudiants));
    		l->p_head=pers;
            pers->suiv = NULL;
    		pers->prec = NULL;
    		nouvo = pers;
    		//ouverture ou creation du fichier en ecriture et test si probleme
    		if((fic = fopen("GestionEtudiants.txt", "r"))==NULL) printf("erreur d'ouverture");
    		else //si pas de probleme
    		{
                while(fscanf(fic, "%s\n", nom)!=-1) //si il y a encore un nom de famille
    			{
    			    nouvo=malloc(sizeof(etudiants));								   //a lire dans le fichier
    				strcpy(nouvo->nom, nom);
    				fscanf(fic, "%s\n", prenom); //lit un prenom et le met dans variable
                    strcpy(nouvo->prenom, prenom); //met dans la cellule
                    fscanf(fic, "%s\n", adresse);
    				strcpy(nouvo->adresse, adresse);
    				fscanf(fic, "%s\n", tel);
    				strcpy(nouvo->tel, tel);
    				fscanf(fic, "%s\n", filiere);
    				strcpy(nouvo->filiere, filiere);
    				fscanf(fic, "%d\n", &niveau);
     
    				//cree une nouvelle cellule
                tmp=malloc(sizeof(etudiants));
                tmp = nouvo;
                etudiants *nouvo;
                nouvo = malloc(sizeof(etudiants));
    			tmp->suiv = nouvo;
    			nouvo->prec = tmp;
    			//l->p_head=pred;
            }
    			//efface la derniere cellule cree car ne sert a rien
    			free(nouvo);
    			tmp->suiv = NULL;
                            l->p_tail=tmp;
    		}
     
    		fclose(fic); //ferme le fichier
     
    	}
    	else printf("\n###  impossible de charger le fichier, une liste existe deja...  ###\n");
     
        //affichertous(l);
    	return &l; //renvoi l'adresse de la liste
    }

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Ton code possède une erreur fondamentale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dlist **recupfichier(etudiants *pers) //recuperation du fichier
    {
    	etudiants *nouvo, *tmp;
    	Dlist *l;
    	l=malloc(sizeof(Dlist));
    ....
    	return &l; //renvoi l'adresse de la liste
    }
    La fonction retourne l'adresse d'une variable locale (l). Or les variables locales sont détruites en sortie de fonction et leur adresse devient illégale. La fonction devrait certainement retourner l, pas &l et le type de retour modifié en conséquence.

    Il comporte des anomalies montrant une erreur de conception :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    		pers = malloc(sizeof(etudiants));
            nouvo = malloc(sizeof(etudiants));
    		l->p_head=pers;
            pers->suiv = NULL;
    		pers->prec = NULL;
    		nouvo = pers;
    A quoi sert l'allocation dynamique nouvo = malloc.... ? La valeur retournée par le malloc est détruite quelques lignes plus bas par nouvo = pers et la mémoire obtenue est devenue inaccessible (et n'a jamais été utilisée).
    On retrouve cette même erreur ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                tmp=malloc(sizeof(etudiants));
                tmp = nouvo;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	etudiants *nouvo, *tmp;
    ....
                etudiants *nouvo;
                nouvo = malloc(sizeof(etudiants));
    C'est chercher les ennuis que de déclarer à nouveau une variable d'identificateur nouvo dans un bloc intérieur : A partir de là, on a deux variables différentes de même nom :
    Avant etudiants *nouvo; nouvo correspond à une variable (celle définie au début) et après cette ligne, nouvo correspond à une autre variable.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci infinement pour ta réponse qui m'a bcp aidé à voir l'erreur et réfléchir une deuxième fois. je te mets au courant des modifications.

Discussions similaires

  1. Réponses: 19
    Dernier message: 07/02/2015, 19h30
  2. Réponses: 8
    Dernier message: 21/01/2014, 19h21
  3. Réponses: 2
    Dernier message: 20/10/2012, 22h07
  4. Réponses: 3
    Dernier message: 16/07/2009, 18h00
  5. Réponses: 22
    Dernier message: 18/06/2008, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo