Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1638 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Fichier et arbre binaire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fichier et arbre binaire

n°1131783
mastaufff
Posté le 27-06-2005 à 00:58:50  profilanswer
 

Bonjour!
Je suis en train de faire un programme gerant une base de donnée grace a des fichiers textes!
J'ai deux fichier txt un avec les données et l'autre avec un index:
Le fichier index se present comme ceci:
c'est un arbre binaire de recherche avec pour caracteristique de structure:
une clé.
un nom.
la clé du fils gauche.
la clé du fils droit.
 
J'ai donc créé un fonction ajouté dans l'arbre seul contrainte ne pas utiliser
de tableau:
Voici ma fonction:

Code :
  1. void index_bd::ajouter_bd(char* nom)
  2. {
  3.    int nbrec;
  4.    int resultat;
  5.    bool end=false;
  6.    index temp,temp2,temp_index,nouvau;
  7.  
  8.  
  9.    FILE* findex_temp;
  10.    fseek(findex,0,SEEK_END);
  11.    nbrec=ftell(findex)/sizeof(index);
  12.    temp2.cle=nbrec+1;
  13.    strcpy(temp2.nom,nom);
  14.    temp2.cle_gauche=0;
  15.    temp2.cle_droite=0;
  16.    fseek(findex,0,SEEK_SET);
  17.    fread(&temp,sizeof(index),1,findex);
  18.    while (end!=true)
  19.    { 
  20.       if(feof(findex))
  21.       {end=true;}
  22.       else{
  23.       resultat=strcmp(nom,temp.nom);
  24.       if(resultat<0)
  25.       {
  26.          if(temp.cle_gauche!=0)
  27.          {
  28.             fseek(findex,(temp.cle_gauche-1)*sizeof(index),SEEK_SET);
  29.             fread(&temp,sizeof(index),1,findex);
  30.          }
  31.          else
  32.          {
  33.             cout<<"le pere est"<<temp.cle;
  34.             temp.cle_gauche=temp2.cle;
  35.             end=true;
  36.          }
  37.       }
  38.       else
  39.       {
  40.          if (temp.cle_droite!=0)
  41.          {
  42.             fseek(findex,(temp.cle_droite-1)*sizeof(index),SEEK_SET);
  43.             fread(&temp,sizeof(index),1,findex);
  44.          }
  45.          else
  46.          {
  47.             cout<<"voici le pere"<<temp.cle<<endl;
  48.             temp.cle_droite=temp2.cle;
  49.             end=true;
  50.          }
  51.       }
  52.       }
  53.       }
  54.       fseek(findex,0,SEEK_SET);
  55.       findex_temp=fopen("findex_temp.txt","w" );
  56.       fread(&temp_index,sizeof(index),1,findex);
  57.       while(fread(&temp_index,sizeof(index),1,findex)!=0)
  58.       {
  59.          if(temp_index.cle!=temp.cle)
  60.          {
  61.             fwrite(&temp_index,sizeof(index),1,findex_temp);
  62.          }
  63.          else{
  64.             fwrite(&temp,sizeof(index),1,findex_temp);
  65.          }
  66.       };
  67.       fwrite(&temp2,sizeof(index),1,findex_temp);
  68.       fclose(findex);
  69.       fclose(findex_temp);
  70.       findex=fopen("index.txt","w" );
  71.       findex_temp=fopen("findex_temp.txt","r" );
  72.       fseek(findex_temp,0,SEEK_SET);
  73.       while(fread(&nouvau,sizeof(index),1,findex_temp)!=0)
  74.       {
  75.          fwrite(&nouvau,sizeof(index),1,findex);
  76.       }
  77.       fclose(findex);
  78.       fclose(findex_temp);
  79.       cout<<temp.cle_droite<<endl;
  80.       cout<<temp.cle_gauche<<endl;
  81. }


 
voici ma classe index:

Code :
  1. class index_bd
  2. {
  3.    private:
  4.       FILE *findex;
  5.       struct index{
  6.                int cle;
  7.                char nom[40];
  8.                int cle_gauche;
  9.                int cle_droite;
  10.                };
  11.      
  12.       index* gauche;
  13.       index* droite;
  14.      
  15.    public:
  16.       index_bd();
  17.       ~index_bd();
  18.       void afficher_bd();
  19.       void ajouter_bd(char nom[40]);
  20.       void supprimer_bd(int);
  21.       void rechercher_bd();
  22. };


 
en executant un debug il prend bien en compte le changement du fils droit et du fils gauche de temp (le pere) mais en faisant un affichage du
fichier index il ne me prends pas la mise a jour du pere!!!
je n'arrive pas a voir ce qui cloche dans la boucle

Code :
  1. while(fread(&temp_index,sizeof(index),1,findex)!=0)
  2.       {
  3.          if(temp_index.cle!=temp.cle)
  4.          {
  5.             fwrite(&temp_index,sizeof(index),1,findex_temp);
  6.          }
  7.          else{
  8.             fwrite(&temp,sizeof(index),1,findex_temp);
  9.          }
  10.       };


 
car si la clé est identique au celle du pere il doit ecrire a la place les donnees contenue dans temp qui sont bonnes avec la verification au debug.
Si quelqu'un pouvait m'eclaircir car j'y ai deja passé l'aprem et c'est peu etre tout bete mais je ne vois pas.
Merci d'avance

mood
Publicité
Posté le 27-06-2005 à 00:58:50  profilanswer
 

n°1131835
Taz
bisounours-codeur
Posté le 27-06-2005 à 08:59:20  profilanswer
 

c'est beau le C.

n°1131843
skeye
Posté le 27-06-2005 à 09:13:10  profilanswer
 

t'es dur, ya des cout<< pour les messages de debug...[:pingouino]


---------------
Can't buy what I want because it's free -
n°1131845
Taz
bisounours-codeur
Posté le 27-06-2005 à 09:15:20  profilanswer
 

en plus l'usage de feof est foireux complet ... tu m'étonnes que ça marche pas. Ensuite, on devrait instituionaliser boost::noncopyable, parce que là, y a du boulot !


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Fichier et arbre binaire

 

Sujets relatifs
Comment transférer mes fichier sur un compte web free ?mail à partir d'un fichier texte
insere un objet dans un Fichier RFTsortie vers un fichier .csv
traitement selon le nom du fichierFormulaire dans un fichier xml
fichier dep2 dans package cachelistage de fichier .csv
Selection de données mysql pour ecrire dans un fichierrenomer/remover un fichier
Plus de sujets relatifs à : Fichier et arbre binaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR