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. #1
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    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 régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    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 émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    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 régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    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
    Points : 13 017
    Points
    13 017
    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 régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu peux mettre l'intégralité de ton Departmentlist.cc ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Voici le fichier Department.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
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    #include "Departmentlist.hh"
    //Constructor
    Departmentlist::Departmentlist(const char* fileName)*:head(NULL)
    {
     
    	ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file event.txt :\n";
    	string var1; 
    	//string var2;
    	//int var3;
    	//int var4;
    	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;		
            	}
     
    			fichier.close();  
    	}
    	else  
    	{
    		cout << "Impossible d'ouvrir le fichier !" << endl;
    	}
     
     
    	NodePointer currPointer = head;
    	while (currPointer != NULL)
    	{		
    		cout<<" Name : " << currPointer->departmentname<<endl;
    		currPointer = currPointer->link;
    		/*cout << " Faculty : " << it->getDepartmentFaculty();
    		cout<< " Students : " << it->getNumberOfStudents();
    		cout<< " Staff: " << it->getNumberOfStaffs() <<endl;
    		currPointer = currPointer->link;
    		*/
    	} 
     
    }
    //End Of Constructor
     
     
    /*void Departmentlist::printDepartmentNames() const{
    	NodePointer Pointer = head;
    	while (currPointer != head)
    	{
    		cout<<currPointer->departmentname<<endl;
    		currPointer = currPointer->link;
    	}
    }*/
     
    void Departmentlist::printPropertiesOfParticularDepartment(string nomdepart){
    }
     
    void Departmentlist::searchParticularDepartmentName(string recherchedepart){
    }
     
    void Departmentlist::AddDepartment(string nomdepartment/*,string facultedepartment,int etudiantsnumber,int personnelnumber*/){
    NodePointer currPointer;
    			NodePointer newNodePointer;
    int inputVal;
    head = new NodeDepart;
    cin>>head->departmentname;
    currPointer = head;
    cin>>inputVal;
    while (cin)
    {
    	newNodePointer = new NodeDepart;
    	newNodePointer->departmentname = inputVal;
    	currPointer->link = newNodePointer;
    	currPointer = newNodePointer;
    	cin>>inputVal;
    }
    currPointer->link = NULL;
    }
     
    void Departmentlist::DeleteEvent(string departtodestroy){
    }

  9. #9
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Tu as un '*' de trop avant la liste d'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Departmentlist::Departmentlist(const char* fileName)*:head(NULL)
    A changer en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Departmentlist::Departmentlist(const char* fileName):head(NULL)

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    C'est très curieux, j'ai vérifié dans mon code, cette * n'apparaît pas mais j'ai effacé l'endroit où elle "apparaissait" et mon code a compilé... peut-être était-ce dû à un problème entre Windows et Linux.
    Quoiqu'il en soit, à présent ça marche, merci à tous
    Maintenant, je souhaite afficher la liste (que je lis dans mon fichier .txt) dans "l'ordre" : avec la méthode précédente, ma liste était inversée par rapport à la liste de mon fichier .txt.
    J'ai écrit :
    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
     
    Departmentlist::Departmentlist(const char* fileName):head(NULL)
    {
     
    	ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file event.txt :\n";
    	string var1; 
    	//string var2;
    	//int var3;
    	//int var4;
    	if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    	{
     
    		//insert each variable in the pointer, one after one
    		NodePointer prevPointer=head;
            	while( fichier >> var1  )
            	{
     
    			NodePointer newNodePointer;	//création d'un nouveau node
    			newNodePointer=new NodeDepart;		
    			newNodePointer->departmentname = var1;
    			//newNodePointer->link= ???;
     
    			prevPointer->link=newNodePointer; //successeur de newNodePointer
    			prevPointer=newNodePointer;
     
            	}
     
    			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 là encore, erreur de segmentation!
    Déjà, je ne sais pas si je suis obligée ou non de définir :
    newNodePointer->link=
    car je ne vois pas comment le définir...

  11. #11
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Le problème de ta boucle est qu'à la première itération prevPointer=head=NULL, donc prevPointer->link=newNodePointer; plante. En plus tu n'initialise jamais head donc tu perd ta liste.
    Un petit conseil, prend 5' à réfléchir avant sur papier pour construire ton algo de construction à l'envers.

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    salut,
    Citation Envoyé par 3DArchi Voir le message
    Le problème de ta boucle est qu'à la première itération prevPointer=head=NULL, donc prevPointer->link=newNodePointer; plante. En plus tu n'initialise jamais head donc tu perd ta liste.
    Un petit conseil, prend 5' à réfléchir avant sur papier pour construire ton algo de construction à l'envers.
    D'autant plus que l'algorithme d'insertion en fin de liste est toujours le meme...

    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
    Voici à peu près à quoi il ressemble:
    /* si tu as un repere de fin de liste:
     * convention: mfirst est le premier élément
     *           mlast est le dernier élément
     *           mnext est (dans la structure élément) la référence vers 
     *                 l'élément suivant
     *           mcount est le compteur (s'il y en a un)
     *           toadd est l'élément à insérer
     */
    Si le mlast existe
        mlast->mnext reçoit toadd
    FIN SI
    SI mfirst n'existe pas
        mfirst reçoit toadd
    FIN SI
    mlast reçoit d'office toadd
    incrementer de mcount
    /* si tu n'a pas de repère de fin de liste
     * les conventions reste identiques (hormis mlast qui n'existe pas)
     */
    Declarer un pointeur sur élément (arbitrairement nommé temp) et
    l'initialiser à mfirst
    SI temp existe (revient à dire SI mfirst existe ;) )
        TANT QUE temp->mnext existe
            temp reçoit temp->mnext
        FIN TANT
        temp->mnext reçoit toadd
    SINON
        mfirst reçoit toadd
    FIN SI
    incrémenter mcount
    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

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Re-bonjour à tous
    J'ai pensé à une nouvelle solution pour résoudre ce problème, mais pour le moment, ça ne fonctionne pas. Cette solution me semble plus simple que celle de koala01 que je n'arrive pas vraiment à faire.
    Mon idée est simplement d'utiliser la récursion.
    Je conserve tout mon constructeur tel quel et je définis une fonction d'affichage récursivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void Departmentlist::afficherDepartment(NodePointer currPointer){
    currPointer = head;
     
    	if (currPointer->link == NULL)
    	{
    		cout<<" Name : " << currPointer->departmentname;
    	}
    	else
    	{
    		afficherDepartment(currPointer->link);
    	}
    }
    Voilà donc mon nouveau constructeur (le même qu'avant, avec l'appel à la fonction afficherDeparmtent):

    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
     
    Departmentlist::Departmentlist(const char* fileName):head(NULL)
    {
     
    	ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file department.txt :\n";
    	string var1; 
    	string var2;
    	int var3;
     
    	if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    	{		
    		//insert each variable in the pointer, on the top
            	while( fichier >> var1 && fichier >> var2 && fichier >> var3)
            	{
    			NodePointer newNodePointer = new NodeDepart;
    			newNodePointer->departmentname = var1;
    			newNodePointer->departmentfaculty = var2;
    			newNodePointer->numberofstudents = var3;
    			newNodePointer->link = head;
    			head = newNodePointer;		
            	}			
    			fichier.close();  
    	}
    	else  
    	{
    		cout << "Impossible d'ouvrir le fichier !" << endl;
    	}	
    	afficherDepartment(newNodePointer);	
    }
    Je définis ma fonction ainsi :
    void afficherDepartment(NodePointer currPointer);
    Et voici mon erreur :
    Departmentlist.cc: In constructor ‘Departmentlist:: Departmentlist(const char*)’:
    Departmentlist.cc:86: erreur: ‘newNodePointer’ was not declared in this scope
    Je ne sais pas pourquoi mon newNodePointer n'est pas déclaré puisque je l'utilise avant.
    Et de manière générale, pensez-vous que mon idée soit bonne?
    Merci

  14. #14
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Bonjour,

    Tu ne fournis pas assez d'infos pour que j'en sois sûr mais cette ligne me paraît louche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NodePointer newNodePointer = new NodeDepart;
    • NodePointer est-il bien un pointeur (nécessaire pour faire un new)?
    • newNodePointer est de type NodePointer, pourtant pour le new tu utilises la classe nodeDepart. Est-ce que nodeDepart hérite bien de NodePointer?


    C'est quelle ligne exactement, la ligne 86 du fichier Departementlist.cc

  15. #15
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    Pardon, je viens de trouver l'erreur, rien à voir avec ce que j'ai dit avant!

    En C++, les variables ne sont valables que dans les boucles ("while", "for", ...), ou les structures conditionnelles ("if", "switch"?, ...) ou autres où tu la déclares.
    Ainsi ton newNodePointer n'est valable que dans ton while, la variable "n'existe plus" au moment où tu appelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    afficherDepartment(newNodePointer);
    Il suffit de remonter la déclaration de ta variable newNodePointer au début de ton constructeur.
    Ce code devrait mieux marcher :

    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
    Departmentlist::Departmentlist(const char* fileName):head(NULL)
    {
     
    	ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file department.txt :\n";
    	string var1; 
    	string var2;
    	int var3;
    	NodePointer newNodePointer;
     
    	if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    	{		
    		//insert each variable in the pointer, on the top
            	while( fichier >> var1 && fichier >> var2 && fichier >> var3)
            	{
    			newNodePointer = new NodeDepart;
    			newNodePointer->departmentname = var1;
    			newNodePointer->departmentfaculty = var2;
    			newNodePointer->numberofstudents = var3;
    			newNodePointer->link = head;
    			head = newNodePointer;		
            	}			
    			fichier.close();  
    	}
    	else  
    	{
    		cout << "Impossible d'ouvrir le fichier !" << endl;
    	}	
    	afficherDepartment(newNodePointer);	
    }

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Merci. J'ai corrigé cette erreur, mais à présent, j'ai une erreur de segmentation à cause de ma fonction récursive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void Departmentlist::afficherDepartment(NodePointer currPointer){
     
    	if (currPointer->link == NULL)
    	{
    		cout<<" Name : " << currPointer->departmentname;
    	}
    	else
    	{
    		afficherDepartment(currPointer->link);
    	}
    }
    Si je demande d'afficher quelque chose dans cette fonction, je suis dans une boucle infinie, ce qui, je pense, signifie que mon currPointer est mal initialisé. Il me semble que je dois pas l'initialiser dans ma fonction récursive.
    Je ne comprends pas pourquoi ça fait ça
    Voilà mon constructeur un peu modifié:
    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
    Departmentlist::Departmentlist(const char* fileName):head(NULL)
    {
     
    	ifstream fichier(fileName) ;
    	cout <<"Here are the depatments contained in the text file department.txt :\n";
    	string var1; 
    	string var2;
    	int var3;
    	NodePointer newNodePointer = new NodeDepart;
     
    	if ( fichier ) // ce test échoue si le fichier n'est pas ouvert
    	{		
    		//insert each variable in the pointer, on the top
            	while( fichier >> var1 && fichier >> var2 && fichier >> var3)
            	{
     
    			newNodePointer->departmentname = var1;
    			newNodePointer->departmentfaculty = var2;
    			newNodePointer->numberofstudents = var3;
    			newNodePointer->link = head;
    			head = newNodePointer;		
            	}			
    			fichier.close();  
    	}
    	else  
    	{
    		cout << "Impossible d'ouvrir le fichier !" << endl;
    	}
     
    	afficherDepartment(head);	 //modif, j'appelle à partir du head
    }

  17. #17
    Membre régulier
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 85
    Points : 113
    Points
    113
    Par défaut
    C'est au moins déjà parce que tu n'as pas fait ce que je t'ai dit...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NodePointer newNodePointer = new NodeDepart;
    Tu as rajouté ça dans ton code, c'est bien la déclaration est en début de fichier, mais je ne t'ai jamais dit que le new devait sortir du "while", regardes bien le code que je t'ai fourni.

    A chaque fois que tu vas faire un tour de ta boucle, tu veux créer un nouvel objet NodePointer qui va être lié avec le précédent, il faut donc bien que tu en crées un nouveau.

    Seule la déclaration du pointeur doit être sortie, pas la création de l'objet pointé.

    Après il y a peut-être d'autres erreurs, mais corriges déjà celle-là!

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Avant tout, je voudrais commencer par discuter un peu de ta décision de créer un alias de type pour les pointeur de type NodeDepart...

    En toute subjectivité et de mon avis personnel, je n'ai pas vraiment l'impression que cette décision soit réellement opportune, car il n'est finalement pas difficile de travailler avec un NodeDepart *, alors que le fait de l'appeler NodePointer est de nature à en surprendre plus d'un qui liraient le code de manière un peu trop "diagonale"...

    Eviter son usage permettrait d'éviter que l'on passe quelque secondes à se "gratter la tête" à se demander "Mais que fait la ligne NodePointeur unnom = new NodeDepart"

    Mais bon, sur ce coup, tu reste malgré tout libre de tes opinions

    Par contre, j'ai la nette impression que tu en demande peut être un peu trop à tes différentes classes

    Je m'explique:

    Ta classe NodeDepart (que j'aurais personnellement appelée Element ) est, non seulement responsable de la représentation "physique" d'un département, mais, en plus, elle doit se charger de maintenir le lien vers un noeud (un élément) suivant: Ca fait deux responsabilités, et donc, une de trop

    De même, tu demandes à ta classe Departmentlist de, non seulement, s'occuper de la gestion interne des départements, mais, en plus, tu lui demande de s'occuper d'aller lire dans un fichier pour les récupérer et de les afficher...

    Cela fait trois responsabilités, et donc deux de trop

    En outre, ta classe ne trouve sa réelle utilité qu'au sein de la liste, il serait donc intéressant d'en faire une classe imbriquée de ta classe liste

    Enfin, si ton implémentation fonctionnait, les différents éléments récupérés dans le fichiers apparaitraient dans ta liste dans l'ordre inverse de celui du fichier...

    Si nous pouvons envisager cet état de fait pour une pile (un système LIFO (Last In First Out ), ce n'est vraiment pas sérieux pour une liste

    Il y a donc au minimum un problème de logique à résoudre

    Tout cela pour te dire que je te conseillerais volontiers de réfléchir à nouveau à la conception de ton projet, car une forme proche de
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    /* Un département correspond au données que tu veux réellement manipuler
     */
    class Departement
    {
        public:
            /* un département est défini par son nom, la facutlé à
             * laquelle il est rattaché et le nombre d'élèves (qui ne peut
             * quoi qu'il arrive pas être négatif
             */
            Departement(std::string const& dname, std::string const&, size_t);
            /* Les constructeurs par copie, opérateurs d'affectation et destructeurs
             * fournis par le compilateur nous conviennent parfaitement
             */
            /* Nous voulons pouvoir récurpérer le nom, la factulté, et
             *le nombre d'élèves
             *
             * Ces fonctions sont des candidates idéales pour être inlinées
             */
            std::string const& departementName() const{return dname;}
            std::string const& facutltyName() const{return fname;}
            size_t studentCount() const{return scount;}
            /* S'il y a peu de chances pour qu'un département change de fac,
             * il doit malgré tout être possible de mettre le nombre d'étudiants
             * à jour...
             *
             * La fonction peut aussi être inlinee
             */
            void setStudentCount(size_t newcount)
            {
                scount = newcount;
            }
            /* Nous pouvons éventuellement envisager de surcharger l'opérateur <<
             * pour faciliter nos besoins d'affichage
             */
            friend std::ostream& operator << (std::ostream& , Departement const &);
        private:
            std::string dname;
            std::string fname;
            size_t scount;
    };
    /* Une liste est composée d'éléments, un élément représente (contient)
     * les informations propres à un département mais la notion d'éléments
     * est propre à la liste
     * 
     * De plus, l'idéal est d'arriver à avoir une insertion en temps constant dans
     * une liste, car elle risque d'être composé d'un nombre (très) important 
     * d'éléments et tout algorithme de complexité supérieur à O(1)
     * finira par se ressentir au niveau des performances
     */
    class Liste
    {
        public:
            /* l'élément va servir à se "balader" parmi le contenu de la liste,
             * et ne servira qu'à ca
             */
            class Element
            {
                public:
                    Element(Departement const&);
                    /*Il faut pouvoir récupérer l'élément suivant, ainsi que
                     * l'information concernant le département, de manière 
                     * constante et non constante
                     * Ce sont de nouveau des candidates idéales à être inlinées
                     */
                    Element * next(){return mnext;}
                    Element const * next() const {return mnext;}
                    Departement const& departement() const{return mdep;}
                    Departement & departement(){return mdep;}
                    /* Comme seule la liste doit être en mesure de modifier
                     * le lien vers l'élément suivant, déclarons la liste amie
                     * de l'élément
                     */
                    friend class Liste;
                private:
                    Departement mdep;
                    Element* mnext;
            };
            /* Par défaut, nous créons une liste vide */
            Liste();
            /* Nous allons implémenter l'idiome "copy and swap" pour sécuriser
             * la copie et l'assignation de la liste
             */
            Liste(Liste const&);
            Liste& operator=(Liste const&);
            /* et il faut adapter le destructeur pour éviter les fuites mémoire */
            ~Liste();
            /* Nous devons en outre pouvoir accéder au minimum au
             * premier élément de la liste, de manière constante et non constante
             */
            Element * begin(){return mfirst;}
            Element const * begin() const {return mfirst;}
     
            size_t size() const{return msize;}
            /* Pour gérer la liste correctement, il faut pouvoir
             *    - insérer un élément (au début, à la fin et "entre deux éléments")
             *    - supprimer un élément
             *    - vider la liste
             *    - éventuellement la trier (mais ce ne sera pas implémenté ici ;))
             */
            void push_back(Departement const &);
            void push_front(Departement const&);
            void insert(Element * const, Departement const&);
            /* surcharge fournie par facilité uniquement */
            void insert(std::string const&, Departement const &);
            void clear();
     
        private:
            Element * mfirst;
            Element * mlast; // pour permettre l'ajout en O(1)
            size_t msize;
    };
    /* La lecture d'une liste dans un fichier, l'écriture dans un fichier et
     * l'affichage ne sont pas du ressort de la liste, mais, au mieux, 
     * de fonctions libres (non membre d'une classe)
     */
    void readFromFile(std::string const &, Liste &);
    void saveToFile(std::string const &, Liste &);
    void show(std::ostream& ofs, Liste const &);
    Et pour laquelle voici les fonction qui n'ont pas été inlinée dans la définition des classes:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    Departement::Departement(std::string const& dname,
                  std::string const& fname,size_t scount): 
                  dname(dname),fname(fname),scount(scount)
    {
    }
    std::ostream& operator<<(std::ostream& ofs, Departement const & dep)
    {
        ofs<<"Nom du Departement : "<<dep.dname<<std::endl
           <<"Nom de la faculte : "<<dep.fname<<std::endl
            <<"Nombre d'etudiant : "<<dep.scount<<std::endl;
        return ofs;
    }
    Liste::Element::Element(Departement const& dep):mdep(dep),mnext(NULL)
    {
    }
    Liste::Liste():mfirst(NULL),mlast(NULL),msize(0)
    {
    }
    Liste::Liste(Liste const& rhs):mfirst(NULL),mlast(NULL),msize(0)
    {
        Element* temp = rhs.mfirst;
        while(temp)
        {
            push_back(temp->departement());
            temp = temp->mnext;
        }
    }
    Liste& Liste::operator = (Liste const & rhs)
    {
        Liste temp(rhs);
        std::swap(mfirst, temp.mfirst);
        std::swap(mlast, temp.mlast);
        std::swap(msize, temp.msize);
        return *this;
    }
    Liste::~Liste()
    {
        Element* temp;
        while(mfirst)
        {
            temp = mfirst->mnext;
            delete mfirst;
            mfirst = temp;
        }
    }
    void Liste::clear()
    {
        Element* temp;
        while(mfirst)
        {
            temp = mfirst->mnext;
            delete mfirst;
            mfirst = temp;
        }
        mlast = NULL;
        msize = 0;
    }
    void Liste::push_back(Departement const & dep)
    {
        /* il nous faut un nouvel élément */
        Element* toadd = new Element(dep);
        /* Si nous avons un dernier élément officiel, il recoit le nouvel élément */
        if(mlast)
            mlast->mnext = toadd;
        /* S'il n'y a pas de premier élément, le nouveau devient le premier de
         * la liste
         */
        if(!mfirst)
            mfirst = toadd;
        /* quoi qu'il en soit, le nouvel élément devient le dernier officiel
         */
        mlast = toadd;
        /* il n'y a plus qu'à mettre à jour la taille */
        ++msize;
    }
    void Liste::push_front(Departement const & dep)
    {
        /* il nous faut un nouvel élément */
        Element* toadd = new Element(dep);
        /* s'il n'y a pas de dernier élément officiel, le nouveau le devient
         */
        if(!mlast)
            mlast = toadd;
        /* Le premier élément se rattache au nouvel élément pour le suivre
         */
        toadd->mnext = mfirst;
        /* quoi qu'il en soit, le nouvel élément devient le premier élément
         * officiel
         */
        mfirst = toadd;
        /* il n'y a plus qu'à mettre à jour la taille */
        ++msize;
    }
    void Liste::insert(Element * const ref, Departement const& dep)
    {
        /* il nous faut un nouvel élement */
        Element* toadd= new Element(dep);
        /* ce qui suit l'élément de référence
         * se ratache au nouvel élément pour le suivre
         */
        toadd->mnext = ref->mnext;
        /* le nouvel élément se ratache à l'élément de référence pour le suivre
         */
        ref->mnext = toadd;
        /* il n'y a plus qu'à mettre la taille à jour */
        ++msize;
    }
    /* et la surcharge pour la facilité */
    void Liste::insert(std::string const& depname, Departement const & dep)
    {
        /* Cherchons dans la liste l'élément correspondant */
        Element* temp = mfirst;
        while(temp && temp->departement().departementName()!=depname)
            ++temp;
        /* si nous l'avons trouvé, nous pouvons nous pouvons l'utiliser
         * comme référence pour l'insertion
         */
        if(temp)
            insert(temp,dep);
    }
    void readFromFile(std::string const& filename, Liste & l)
    {
       /* j'ai considéré un format de fichier CSV pour la lecture
        * ce qui permet d'avoir le departement des sports et loisir et
        * la facutle du corps sain dans un esprit sain :D ;) 
        */
        std::ifstream ifs(filename.c_str());
        std::string read;
        while(std::getline(ifs, read))
        {
            std::string dname;
            std::string fname;
            char sep1;
            char sep2;
            size_t num;
            std::stringstream ss;
            ss<<read;
            std::getline(ss,dname,',');
            std::getline(ss,fname,',');
            ss>>num;
            Departement dep(dname, fname,num);
            l.push_back(dep);
        }
    }
    void saveToFile(std::string const & filename, const Liste & l)
    {
       /* ici aussi, le format de sauvegarde envisagé est CSV */
        std::ofstream ofs(filename.c_str());
        Liste::Element const * temp = l.begin();
        while(temp)
        {
            Departement const & dep = temp->departement(); //pour la facilité d'écriture
            ofs<<dep.departementName()<<","
               <<dep.facutltyName()<<","
               <<dep.studentCount()<<std::endl;
            temp = temp->next();
        }
    }
    void show(std::ostream& ofs, Liste const & l)
    {
        Liste::Element const * temp=l.begin();
        while(temp)
        {
            ofs<<temp->departement()<<std::endl;
            temp=temp->next();
        }
    }
    Le tout pouvant être utilisé sous une forme proche de
    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
    int main()
    {
        /*  créons une liste vide */
        Liste l;
        /* que nous remplissons sur base du contenu du fichier "test.txt" */
        readFromFile("test.txt", l);
        /* nous avons ensuite deux solutions pour l'affichage :
         * soit en utilisant la fonction que nous avons définie à cet effet
         */
        show(std::cout, l);
        /* soit en en réécrivant le code */
        Liste::Element* temp = l.begin();
        while(temp)
        {
            std::cout<< temp->departement()<<std::endl;
            temp=temp->next();
        }
    }
    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

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    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?

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    219
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 219
    Points : 97
    Points
    97
    Par défaut
    Merci koala01 pour ces remarques. Je suis debutante en C++ donc je ne connais pas la meilleure facon d'organiser les differentes classes. Alors, les remarques sont les bienvenues.
    Ceci dit, j'ai essaye de faire ce que demandait mon sujet alors soit le sujet n'optimise pas l'utilisation des classes (peut être parce que pour des debutants c'est plus simple ainsi), soit je n'ai pas compris ce qui etait demande (possible ...)
    Images attachées Images attachées

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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