Partage
  • Partager sur Facebook
  • Partager sur Twitter

remplir une liste chainé HELP

a partir d'un fichier txt

    31 mai 2008 à 22:05:54

    salut tout le monde , c ma premiére participation avec vous a ce forum ,j'espere que je v passer un bon moment, ben ma question et la suivante:
    comment remplir une liste chainé a partir d'un fichier txt ???
    voila le programme que j realiser ,il consiste a remplir un fichier txt avec les comptes des adherant a une banque, ce compte et une structur composé par un id(numero du compte) ,nom , solde et la situation (debiteur oui/non)
    le programme sauvegarde sur le fichier mais j'arrive po a trouver la procedure qui extrait du fichier(id, nom ,sold , debiteur(o/n)) j fait un essai mai j'arrive pas
    AIDEZ MOI PLZ
    merci d'avance
    #include <conio.h>
    #include <iostream>
    #include<stdlib.h>
    #include<fstream>
    #include<string>
    
    using namespace std;
    
    typedef struct {
            int id_cmpt;
            string nom_proprietaire;
            long sold;
            char debiteur;
            }compte;        
            
    typedef compte typeEle;
    
    typedef struct bank liste;
    struct bank{
           typeEle compte;
           liste* suiv;
           };
    
    liste* initialisation(){
           return NULL;
           }
    bool estVide(liste* l){
    
         return (l==NULL);
         }
         
    liste* ajout(liste* l,int id,string nom,long sld,char deb){
           liste* b;
           b=(liste*)malloc(sizeof(liste));
           b->compte.id_cmpt=id;
           b->compte.nom_proprietaire=nom;
           b->compte.sold=sld;
           b->compte.debiteur=deb;
           b->suiv=l;
           l=b;
           return l;
           }
           
    void affiche(liste* l){
         liste* par;
         par=l;
         while (par!=NULL){
               cout<<"identifiant : "<<par->compte.id_cmpt<<"  nom : "<<par->compte.nom_proprietaire<<"  sold : "<<par->compte.sold<<"  debiteur(true/false) : "<<par->compte.debiteur<<endl;
               par=par->suiv;
               }
         }
    liste* recherche(liste* l,int id){
         liste* par;
         par=l;
         while ( (par!=NULL) && (par->compte.id_cmpt!=id) )
               par=par->suiv;
    
         return (par); 
         }
         
    liste* suppression(liste *l,int id){
           
          liste *parc;
          liste *pred;
          parc=l;
          
          if(parc->compte.id_cmpt==id){
            l=l->suiv;
            free(parc);
            }
          else
              while(parc!=NULL && parc->compte.id_cmpt!=id){
                    pred=parc;
                    parc=parc->suiv;                                             
               }
             if(parc!=NULL){
               pred->suiv=parc->suiv;                
               free(parc);
              }
          return (l);
          }
    
    void sauvegarde(liste* l){  
          liste* parc;
          parc=l;
         string nom_fichier("bank.txt");
         fstream fichier(nom_fichier.c_str(),ios::out|ios::app);// ouverture en écriture avec conservation de toutes les données insérées dans fichier ouvert
         if(fichier.fail())//si l'ouverture du flux a echouée
         cerr<<"Erreur: impossible d ecrire dans le fichier "<<nom_fichier<<endl;
         else{
              while(!estVide(parc)){
                       fichier<<parc->compte.id_cmpt<<"|"<<parc->compte.nom_proprietaire<<"|"<<parc->compte.sold<<"|"<<parc->compte.debiteur<<";\n";
                       //getline;
                       parc=parc->suiv;
                     }
              }
       fichier.close();// on ferme le fichier
         }     
    /*void loadList(){
           string nom_fichier("bank.txt");   
           ofstream fichier(mon.c_str(),ios::in);
           if(fichier.fail){*/
           
           
           
              
    int main(){
        
        int choix;
         liste *tete,*res;
         int id,idRech;
         string nom;
         char deb;
         long sld;
         tete=initialisation(); 
         
        
        do{ 
               cout<<"     MENU"<<endl;                 
               cout<<"1- ajouter un compte"<<endl;
               cout<<"2- afficher la liste des comptes"<<endl;
               cout<<"3- rechercher un client"<<endl;
               cout<<"4- supprimer un client"<<endl;
               cout<<"5- sauvegarder"<<endl;
               cout<<"0- quitter"<<endl;                 
               cout<<"donner votre choix"<<endl;
               cin>>choix;
               
        switch(choix){
                      
                      case 1:{
                              cout<<"donner l'id du compte"<<endl;      
                              cin>>id;
                              cout<<"donner le nom du proprietaire"<<endl;
                              cin>>nom;
                              cout<<"donner le solde du compte"<<endl;
                              cin>>sld;
                              cout<<"debiteur/ crediteur "<<endl;
                              cin>>deb;
                              tete=ajout(tete,id,nom,sld,deb);
                              }break;
                    case 2:{
                            affiche(tete);
                            }break;    
                    case 3:{
                            cout<<"donnez l'identifiant du client a rechercher"<<endl;
                            cin>>idRech; 
                            res=recherche(tete,idRech);   
                            if(res==NULL)
                               cout<<"ce client ne possede pas de compte!!"<<endl;
                            else{
                                cout<<"le compte du client :"<<endl;
                                cout<<"nom : "<<res->compte.nom_proprietaire<<" solde : "<<res->compte.sold<<"  debiteur(true/false) : "<<res->compte.debiteur<<endl;
                               }
                          }break;    
                   case 4:{
                             cout<<"donnez l'identifiant du client a supprimer"<<endl;
                             cin>>idRech;
                             tete=suppression(tete,idRech);
                          }break;      
                  case 5:{
                         sauvegarde(tete);
                         }break;
                 case 0:{
                        sauvegarde(tete);
                        exit(0);   
                        }break;                             
                    }
             }       
             while(choix!=0);
             
         return(0);    
        }
    
    • Partager sur Facebook
    • Partager sur Twitter
      31 mai 2008 à 22:41:50

      ne peux tu pas utiliser les listes que propose la STL ce serait plus facile .....
      • Partager sur Facebook
      • Partager sur Twitter
        31 mai 2008 à 22:45:57

        liste chainee c'est pour le forum C . concernant le C++ je te conseil des <vector> ou des <list>
        • Partager sur Facebook
        • Partager sur Twitter
          31 mai 2008 à 22:53:53

          Accessoirement, malloc est incompatible avec l'allocation d'objets.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            31 mai 2008 à 23:10:40

            j'ai rien pigé les gars expliqué plus
            • Partager sur Facebook
            • Partager sur Twitter
              31 mai 2008 à 23:47:27

              Les listes chaînées sont surtout utilisées en C, puisqu'il existe des outils dans la <acronym title="Standard Template Library">STL</acronym> de C++ qui permettent de manipuler des listes et tableaux dynamiques.

              http://www.cplusplus.com/reference/stl/list/ : Listes dynamiques
              http://www.cplusplus.com/reference/stl/vector/ : Tableaux dynamiques

              (la différence majeure est le fait que les éléments de vector sont à un emplacement contigü en mémoire).

              Concernant l'utilisation des listes chainées dans ton code, il suffit d'obtenir les données du fichier pour pouvoir appeler la méthode ajout. Ouvrir un fstream ou un ifstream et utiliser l'opérateur >> est un très bon moyen d'obtenir les données nécessaires. Rappelle-toi, tu dois lire les données dans le même ordre que tu les écris.
              • Partager sur Facebook
              • Partager sur Twitter
                1 juin 2008 à 11:32:31

                Salut,
                Je constate que les gens commencent a avoir une tendence à donner des explications approximatives -_-
                Bon, pour ton problème, le premier point est que ton typedef est completement inutile ;) en c++, un struct induit directememnt un typedef réalisé par le compilo ;)
                secondo, ton
                b=(liste*)malloc(sizeof(liste));
                
                peut être remplacé par
                b = new liste;
                
                ;)
                Et puisque nous sommes en c++, je me permets de te donner un conseil pour l'ajout et toutes modifications dans ta liste:
                void ajout(liste*& tete, int val)//Utilise les références le plus possible, ça simplifie beaucoup le travail
                //et c'est plus propre 
                {
                liste* ele = new liste;
                if(!ele)
                {
                exit(0);
                }
                //------------------------
                //On réalise une insertion 
                //en tête de liste
                //------------------------
                
                ele->next = tete;
                tete = ele;
                ele->val = val;
                }
                

                Et la, au lieu de retourner la nouvelle tête de liste, tu peux utiliser le retour pour vérifier l'état de la fonction (1 allocation réussie, -1 erreur) ;)
                Voila, normalement comme ça, t'auras pas de problème :)
                • Partager sur Facebook
                • Partager sur Twitter

                La maîtrise des fondamentaux est le fondamental de la Maîtrise.

                  1 juin 2008 à 13:14:12

                  Pas "peut être remplacé", mais "doit être remplacé". malloc est incompatible avec les types non POD: il n'appelle pas le constructeur, or la struct contient une string, elle est donc non POD.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    1 juin 2008 à 14:05:10

                    Ap, désolé :p 1000 excuses :)
                    C'est vrai, malloc DOIT être remplacé par new, lmghs a donné l'explication qu'il faut ;)
                    Merci lmghs ;)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    La maîtrise des fondamentaux est le fondamental de la Maîtrise.

                    remplir une liste chainé HELP

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown