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 :

lire un fichier txt, liste chaînée et erreur de segmentation


Sujet :

C++

  1. #21
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par jane40 Voir le message
    Ok, bête erreur de ma part. J'ai plus mon erreur de segmentation, merci.
    A present, je suis confrontee aux limites de mon idee :
    Avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Departmentlist::afficherDepartment(NodePointer currPointer){
    	if (currPointer->link == NULL)
    	{
    		cout<<" Name : " << currPointer->departmentname;
    	}
    	else
    	{
    		afficherDepartment(currPointer->link);
    	}
    }
    je ne peux afficher que le dernier element de ma liste chainee (ie le premier de mon fichier txt). Pour pouvoir les afficher tous, je pense que je dois utiliser 2 pointeurs, par exemple avec un qui pointe sur le successeur de currPointer. Et je fais l'affichage tant qu'il y a un precedecesseur.
    Est-ce comme ca qu'il faut faire pour obtenir l'affichage complet?
    si tu pars sur une idée de récursivité, inverse simplement l'ordre dans lequel les choses se font :

    Commence par afficher l'élément courent, puis, si tu as un élément suivant, affiche le, ou, étant donné que ta liste est inversée par rapport à la liste lue dans le fichier, si tu veux la récupérer dans l'ordre, cela donnerait: si il y a un élément suivant, provoquons en l'affichage puis, quoi qu'il arrive, provoquons l'affichage de l'élément courent
    Cela donne donc, pour la première solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Departmentlist::afficherDepartment(NodePointer currPointer){
     
    	cout<<" Name : " << currPointer->departmentname;
    	if (currPointer->link == NULL)
    	{
    		afficherDepartment(currPointer->link);
    	}
    }
    et pour la deuxième (celle qui permet d'obtenir l'affichage dans l'ordre)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Departmentlist::afficherDepartment(NodePointer currPointer){
     
    	if (currPointer->link == NULL)
    	{
    		afficherDepartment(currPointer->link);
    	}
    	cout<<" Name : " << currPointer->departmentname;
    }
    Mais, ceci dit, l'optique récursive n'est pas forcément la meilleure que l'on puisse avoir dans ce cas, et une boucle pourrait très bien faire l'affaire, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Departementlist::afficherDepartements()
    {
        NodePointer temp = head;
        while(temp)
        {
             cout<<" Name : " << temp->departmentname;
             temp = temp->link;
        }
    }
    A ceci près que l'affichage sera inversé car... ta logique de lecture le fait ainsi ... Ce qui nous ramène à réponse précédente
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  2. #22
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Ben d'habitude on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void afficheListe(List list)
    {
       Node* node = list.getHead();
       while(node != NUL)
       {
          cout << node->trucàafficher;
          node = node->next;
       }
    }
    Mais vu que tu as inséré les éléments à l'envers (insertion en tête au lieu d'insertion en queue) ça se complique pas mal.

    L'affichage avec une fonction récursive me semble être une bonne solution dans ce cas. Par contre j'ai l'impression que tu ne saisis pas trop comment marche la récursion, car ta fonction afficherDepartment est presque bonne, à une erreur énorme près.

    Edit : Bon koala a donné la réponse plus haut.

  3. #23
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Par défaut
    Je ne suis pas très alèse avec la récursivité mais effectivement, tu ne dois afficher que le premier élément à cause de ton "if" sur le "cout". Il suffit de le supprimer.

    Ça devrait marcher (ou pas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Departmentlist::afficherDepartment(NodePointer currPointer){
     
    	cout<<" Name : " << currPointer->departmentname;
     
    	if (currPointer->link != NULL)
    	{
    		afficherDepartment(currPointer->link);
    	}
    }
    Sinon je trouve les conseils de koala01 très avisés, quand tu auras un peu de temps (et pourquoi pas tout de suite), jettes-y un œil, ça ne pourra que te permettre de progresser.

    Une bonne conception, issue d'une bonne réflexion, évites souvent beaucoup de questions.

  4. #24
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Merci beaucoup a vous, ca marche enfin!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void Departmentlist::afficherDepartment(NodePointer currPointer){
     
     
    	if (currPointer->link != NULL)
    	{
    		afficherDepartment(currPointer->link);
    	}
    	cout<<" Name : " << currPointer->departmentname;
     
    }
    ps:S'il me reste du temps avant de rendre ce projet, j'essairai d'ameliorer mes classes

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/12/2011, 19h37
  2. Lire un fichier.txt et le traduire en liste
    Par tamise dans le forum Débuter
    Réponses: 9
    Dernier message: 25/12/2010, 20h20
  3. Lire un fichier .TXT en donnant une URL
    Par Matt2094 dans le forum Langage
    Réponses: 9
    Dernier message: 03/05/2006, 14h35
  4. Lire un fichier txt par http (C sous Linux)
    Par sleg dans le forum Réseau
    Réponses: 4
    Dernier message: 18/10/2005, 11h07
  5. Réponses: 4
    Dernier message: 05/10/2004, 17h11

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