Fichier et arbre binaire

Fichier et arbre binaire - C++ - Programmation

Marsh Posté le 27-06-2005 à 00:58:50    

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

Reply

Marsh Posté le 27-06-2005 à 00:58:50   

Reply

Marsh Posté le 27-06-2005 à 08:59:20    

c'est beau le C.

Reply

Marsh Posté le 27-06-2005 à 09:13:10    

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


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 27-06-2005 à 09:15:20    

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 !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed