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 :

fichier et liste chainée


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 36
    Points
    36
    Par défaut fichier et liste chainée
    voila j'ai un probléme avec cette fonction qui crée a partire d'un fichier une liste chainée
    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
    void charge(struct liste **ob,char adr[])
    { struct liste *parc;
      struct liste *de;
     
      FILE *rd;
      rd=fopen(adr,"r");
      de=(struct liste *)malloc(sizeof(struct liste));
      parc=(struct liste *)malloc(sizeof(struct liste));
    parc=de;
     /* chargement du fichier dans une liste chain‚ */
     /*----------------------------------------------*/
     fscanf(rd,"%s\n",parc->name);
     
    fscanf(rd,"%s\n",parc->prenom);
    printf("\n--%s",parc->name);
     getch();
    fscanf(rd,"%s\n",parc->bdate);
    fscanf(rd,"%s\n",parc->code);
    fscanf(rd,"%c\n",parc->sexe);
    fscanf(rd,"%d\n",parc->nbe);
    fscanf(rd,"%s\n",parc->enfcode);
    while(!feof(rd))
    {
    parc->suiv=(struct liste *)malloc(sizeof(struct liste));
    parc=parc->suiv;
     fscanf(rd,"%s\n",parc->name);
     
     
      printf("\n--%s",parc->name);
     getch();
    fscanf(rd,"%s\n",parc->prenom);
    fscanf(rd,"%s\n",parc->bdate);
    fscanf(rd,"%s\n",parc->code);
    fscanf(rd,"%c\n",parc->sexe);
    fscanf(rd,"%d\n",parc->nbe);
    fscanf(rd,"%s\n",parc->enfcode);
    //parc=parc->suiv;
    }
    parc->suiv=NULL;
    *ob=de;
    }

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par seifdev
    voila j'ai un probléme avec cette fonction qui crée a partire d'un fichier une liste chainée
    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
    void charge(struct liste **ob,char adr[])
    { struct liste *parc;
      struct liste *de;
     
      FILE *rd;
      rd=fopen(adr,"r");
      de=(struct liste *)malloc(sizeof(struct liste));
      parc=(struct liste *)malloc(sizeof(struct liste));
    parc=de;
     /* chargement du fichier dans une liste chain‚ */
     /*----------------------------------------------*/
     fscanf(rd,"%s\n",parc->name);
     
    fscanf(rd,"%s\n",parc->prenom);
    printf("\n--%s",parc->name);
     getch();
    fscanf(rd,"%s\n",parc->bdate);
    fscanf(rd,"%s\n",parc->code);
    fscanf(rd,"%c\n",parc->sexe);
    fscanf(rd,"%d\n",parc->nbe);
    fscanf(rd,"%s\n",parc->enfcode);
    while(!feof(rd))
    {
    parc->suiv=(struct liste *)malloc(sizeof(struct liste));
    parc=parc->suiv;
     fscanf(rd,"%s\n",parc->name);
     
     
      printf("\n--%s",parc->name);
     getch();
    fscanf(rd,"%s\n",parc->prenom);
    fscanf(rd,"%s\n",parc->bdate);
    fscanf(rd,"%s\n",parc->code);
    fscanf(rd,"%c\n",parc->sexe);
    fscanf(rd,"%d\n",parc->nbe);
    fscanf(rd,"%s\n",parc->enfcode);
    //parc=parc->suiv;
    }
    parc->suiv=NULL;
    *ob=de;
    }
    Quel probleme rencontres-tu exactement ?

    Sinon quelques remarques :
    * Si tu veux que les gens puissent t'aider, l faut poster un code compilable, ici il manque par exemple la definition de struct liste.
    *Il n'y a aucun test sur le retour des fonctions qui peuvent echouer (fopen, malloc, fscanf) et donc aucune gestion d'erreur.
    * fscanf attends des adresses, ce n'est donc pas fscanf(rd,"%d\n",parc->nbe); mais fscanf(rd,"%d\n",&parc->nbe);
    * A moins de controler le format du fichier et d'etre a 100% certains du contenu, il est dangeureux d'utiliser fscanf(..., "%s",...) qui n'effectue aucun controle sur la taille de la chaine. A remplacer par fgets.
    * Tu alloue de la memoire pour parc, puis tu modifies l'adresse contenue dans parc en y recopiant l'adresse contenue dans de. La zone memoire allouee est donc perdue ==> fuite de memoire.
    * feof ne fonctionne pas comme ca. Si une erreur de lecture est rencontree, la fonction feof() permet de determiner si il s'agit de la fin de fichier ou non.
    * getch() n'est pas une fonction standard du C. Pourquoi ne pas utliser fgetc() ?

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    mon type de probléme la liste chainée n'est pas correcte les lignes ne prend pas la place qui devrais prendre dans chaque liste
    disons si un fichier contient
    nom
    prenom
    date
    la liste ne reçoit pas ce qu'elle devrais recevoir

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2007
    Messages : 43
    Points : 36
    Points
    36
    Par défaut
    ça y est j'ai trouver l'erreur ma fonction ne contient pas d'erreur l'erreur vient du fichier que j'utilise

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    je suis quasi-certain que dans ta structure tu as déclaré tes variables (nom par exemple) comme un pointeur.. .

    Donc il faut ALLOUER de la place pour pouvoir stocker les valeurs dedans.

    D'autre part, très nettement préférer fgets + sscanf que scanf.

    Enfin, poste ta structure si tu veux qu'on y pige quelque chose.

Discussions similaires

  1. Stocker dans fichier des listes chainées
    Par sisiniya dans le forum C
    Réponses: 7
    Dernier message: 26/03/2010, 22h10
  2. fichier plus liste chainé
    Par Warfdog dans le forum Débuter
    Réponses: 2
    Dernier message: 18/11/2009, 16h25
  3. Lecture d'un fichier et liste chainée
    Par étoile de mer dans le forum Débuter
    Réponses: 20
    Dernier message: 02/06/2008, 00h30
  4. Réponses: 3
    Dernier message: 30/03/2007, 19h03
  5. [Stratégie]Sauvegarde d'une liste chainée dans un fichier
    Par BernardT dans le forum Général Java
    Réponses: 17
    Dernier message: 25/07/2005, 18h04

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