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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut lire un fichier txt, liste chaînée et erreur de segmentation
    Bonjour,
    Je cherche à lire les données d'un fichier.txt en utilisant une liste chaînée. Les données s'affichent à l'écran mais erreur de segmentation aussi !

    Name : DepartmentofCommunicationsEngineering
    Name : DepartmentofSignalProcessing
    Name : DepartmentofSoftwareSystems
    Erreur de segmentation
    J'utilise ma liste chaînée sur des départements.
    Voici Department.hh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    //create the dynamic linked list
    struct NodeDepart
    {
    	string departmentname;
    	NodeDepart* link;			
    };
    typedef NodeDepart* NodePointer;
    Departmentlist.cc
    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
     
    ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file event.txt :\n";
    	string var1; 
    	if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    	{
     
    		//insert each variable in the pointer, on the top
            	while( fichier >> var1  )
            	{
    			NodePointer newNodePointer = new NodeDepart;
    			newNodePointer->departmentname = var1;
    			newNodePointer->link = head;
    			head = newNodePointer;		
            	}
    			//dire que le dernier newNodePointer->departmentname est NULL ?
    			fichier.close();  
    	}
    	else  
    	{
    		cout << "Impossible d'ouvrir le fichier !" << endl;
    	}
     
     
    	NodePointer currPointer = head;
    	while (currPointer != NULL)
    	{		
    		cout<<" Name : " << currPointer->departmentname<<endl;
    		currPointer = currPointer->link;
    	}
    Je pense que l'erreur vient du moment où j'ajoute les éléments dans ma liste, je ne dis pas que le dernier doit pointer sur NULL et quand je les affiche, vu que je teste currPointer != NULL, forcément, ça bugge, mais je sais pas comment régler mon problème
    Departmentlist.hh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Departmentlist{
     
    private :
    	NodePointer head;
     
    public:
    	Departmentlist(const char*);
    	Departmentlist();
    	Departmentlist(string);
    	//~Departmentlist();
     
    };
    Des suggestions ?
    Merci

  2. #2
    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
    Bonsoir,

    Dans le code que tu fournis, la toute première fois que tu rentres dans la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    while( fichier >> var1  )
    {
    	NodePointer newNodePointer = new NodeDepart;
    	newNodePointer->departmentname = var1;
    	newNodePointer->link = head;
    	head = newNodePointer;		
    }
    la variable head n'est pas initialisée, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	newNodePointer->link = head;
    ne va pas bien se passer.
    Peut-être est-ce que ça vient de là?

    C'est une contrainte l'utilisation des listes chaînées, parce que sinon il y a les std::list, tu te casseras moins la tête...

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Je pense que l'erreur vient du moment où j'ajoute les éléments dans ma liste, je ne dis pas que le dernier doit pointer sur NULL et quand je les affiche, vu que je teste currPointer != NULL, forcément, ça bugge...
    Ouaip, ça doit venir de là. Si le dernier pointeur n'est pas initialisé il pointe quelque part en mémoire (au hasard) , d'où le seg fault quand on tente d'y accéder. Juste pour résumer, à l'heure actuelle, ton code insère les nouveaux éléments en tête de liste, c'est à dire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    el4->el3->el2->el1->NULL
    ^
    |
    head
     
    // après  insertion de newEl.
    newEl->el3->el2->el1->NULL
    ^
    |
    head
    Il faut donc s'assurer que le tout premier élément inséré (el1) pointe bien sur NULL. Or le code pour ajouter un élément fait
    newNodePointer->link = head; Donc il faut que head soit initialisé à NULL lors de la création de la liste. Dans le constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Departmentlist::Departmentlist() : head(NULL) {} 
    Departmentlist::Departmentlist(string file) : head(NULL)
    {
       /* lire le fichier et insérer les éléments */
    };

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Merci pour vos réponses.
    J'ai donc essayé d'initialiser mon head, dans un premier temps comme indiqué par Arzar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Departmentlist(const char*):head(NULL);
    Department::Departmentlist(const char* filename):head(NULL);
    dans les fichier.hh et .cc mais j'ai eu cette erreur :
    g++ -c -o Departmentlist.o Departmentlist.cc
    Departmentlist.cc:9: erreur: stray ‘\342’ in program
    Departmentlist.cc:9: erreur: stray ‘\200’ in program
    Departmentlist.cc:9: erreur: stray ‘\255’ in program
    In file included from Departmentlist.cc:4:
    Departmentlist.hh: In constructor ‘Departmentlist:: Departmentlist(const char*)’:
    Departmentlist.hh:20: erreur: expected `{' at end of input
    Departmentlist.cc: At global scope:
    Departmentlist.cc:9: erreur: redefinition of ‘Departmentlist:: Departmentlist(const char*)’
    Departmentlist.hh:20: erreur: ‘Departmentlist:: Departmentlist(const char*)’ previously defined here
    make: *** [Departmentlist.o] Erreur 1
    Alors j'ai essayé :

    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
     
    Departmentlist::Departmentlist(const char* fileName)
    {
     
    	ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file department.txt :\n";
    	string var1; 
    	if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    	{
     
    		//insert each variable in the pointer, on the top
            	while( fichier >> var1  )
            	{
    			NodePointer newNodePointer = new NodeDepart;
    			newNodePointer->departmentname = var1;
    			newNodePointer->link = head;
    			head = newNodePointer;		
            	}
    	head=NULL; ///changement : initialisation ici ///
    	fichier.close();  
    	}
    	else  
    	{
    		cout << "Impossible d'ouvrir le fichier !" << endl;
    	}
     
     
    	NodePointer currPointer = head;
    	while (currPointer != NULL)
    	{		
    		cout<<" Name : " << currPointer->departmentname<<endl;
    		currPointer = currPointer->link;
    	}
    Mais j'ai eu une erreur similaire :
    g++ -c -o Departmentlist.o Departmentlist.cc
    In file included from Departmentlist.cc:4:
    Departmentlist.hh:20: erreur: stray ‘\342’ in program
    Departmentlist.hh:20: erreur: stray ‘\200’ in program
    Departmentlist.hh:20: erreur: stray ‘\255’ in program
    Departmentlist.cc:9: erreur: stray ‘\342’ in program
    Departmentlist.cc:9: erreur: stray ‘\200’ in program
    Departmentlist.cc:9: erreur: stray ‘\255’ in program
    make: *** [Departmentlist.o] Erreur 1
    J'ai jamais vu ce type d'erreur, ça concerne quoi?

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par jane40 Voir le message
    Merci pour vos réponses.
    J'ai donc essayé d'initialiser mon head, dans un premier temps comme indiqué par Arzar :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Departmentlist(const char*):head(NULL);
    Department::Departmentlist(const char* filename):head(NULL);
    dans les fichier.hh et .cc mais j'ai eu cette erreur :
    Presque : ce n'est pas dans la déclaration mais dans la définition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // .hh :
    class Departmentlist{
    //...
    Departmentlist(const char*);
    }
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // .cc
    Departmentlist::Departmentlist(const char*):head(NULL) 
    {
    //...
    }

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Par défaut
    Merci 3DArchi pour cette précision. J'ai donc fait comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Departmentlist::Departmentlist(const char* fileName):head(NULL) //ligne 9
    {
       /* lire le fichier et insérer les éléments */
    };
    uniquement dans le fichier.cc. J'ai moins d'erreurs, mais ça marche toujours pas
    g++ -c -o Departmentlist.o Departmentlist.cc
    Departmentlist.cc:9: erreur: stray ‘\342’ in program
    Departmentlist.cc:9: erreur: stray ‘\200’ in program
    Departmentlist.cc:9: erreur: stray ‘\255’ in program
    make: *** [Departmentlist.o] Erreur 1
    Et je n'arrive pas à trouver d'info sur cette erreur... Est-ce en rapport avec les pointeurs? La déclaration de head à NULL?
    Merci pour votre aide

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Tu peux mettre l'intégralité de ton Departmentlist.cc ?

+ Répondre à la discussion
Cette discussion est résolue.

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