Fichier et arbre binaire c++

Fermé
Metek - 26 juin 2005 à 21:05
 Utilisateur anonyme - 30 août 2005 à 13:16
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:
void index_bd::ajouter_bd(char* nom)
{
   int nbrec;
   int resultat;
   bool end=false;
   index temp,temp2,temp_index,nouvau;
   
   
   FILE* findex_temp;

   fseek(findex,0,SEEK_END);
   nbrec=ftell(findex)/sizeof(index);


   temp2.cle=nbrec+1;
   strcpy(temp2.nom,nom);
   temp2.cle_gauche=0;
   temp2.cle_droite=0;


   fseek(findex,0,SEEK_SET);
   fread(&temp,sizeof(index),1,findex);
   while (end!=true)
   {   
      if(feof(findex))
      {end=true;}
      else{

      resultat=strcmp(nom,temp.nom);

      if(resultat<0)
      {
         if(temp.cle_gauche!=0)
         {
            fseek(findex,(temp.cle_gauche-1)*sizeof(index),SEEK_SET);
            fread(&temp,sizeof(index),1,findex);
         }
         else
         {
            cout<<"le pere est"<<temp.cle;
            temp.cle_gauche=temp2.cle;
            end=true;
         }
      }
      else
      {
         if (temp.cle_droite!=0)
         {
            fseek(findex,(temp.cle_droite-1)*sizeof(index),SEEK_SET);
            fread(&temp,sizeof(index),1,findex);
         }
         else
         {
            cout<<"voici le pere"<<temp.cle<<endl;
            temp.cle_droite=temp2.cle;
            end=true;
         }
      }
      }
      }

      fseek(findex,0,SEEK_SET);
      findex_temp=fopen("findex_temp.txt","w");
      fread(&temp_index,sizeof(index),1,findex);
      while(fread(&temp_index,sizeof(index),1,findex)!=0)
      {
         if(temp_index.cle!=temp.cle)
         {
            fwrite(&temp_index,sizeof(index),1,findex_temp);
         }
         else{
            fwrite(&temp,sizeof(index),1,findex_temp);
         }
      };
      fwrite(&temp2,sizeof(index),1,findex_temp);
      fclose(findex);
      fclose(findex_temp);
      findex=fopen("index.txt","w");
      findex_temp=fopen("findex_temp.txt","r");
      fseek(findex_temp,0,SEEK_SET);

      while(fread(&nouvau,sizeof(index),1,findex_temp)!=0)
      {
         fwrite(&nouvau,sizeof(index),1,findex);
      }
      fclose(findex);
      fclose(findex_temp);
      cout<<temp.cle_droite<<endl;
      cout<<temp.cle_gauche<<endl;

}


voici ma classe index:
class index_bd

{

   private:

      FILE *findex;

      struct index{

               int cle;

               char nom[40];

               int cle_gauche;

               int cle_droite;

               };



      

      index* gauche;

      index* droite;

      
   public:

      index_bd();
      ~index_bd();

      void afficher_bd();

      void ajouter_bd(char nom[40]);

      void supprimer_bd(int);

      void rechercher_bd();
};


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
while(fread(&temp_index,sizeof(index),1,findex)!=0)
      {
         if(temp_index.cle!=temp.cle)
         {
            fwrite(&temp_index,sizeof(index),1,findex_temp);
         }
         else{
            fwrite(&temp,sizeof(index),1,findex_temp);
         }
      };


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
A voir également:

20 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juin 2005 à 21:47
Et pourquoi n'utiliserais tu pas la classe map de la STL qui me semble adaptée à ton problème. Cette méthode te permettrait de programmer en C++, et sans utiliser de tableau (car là c'est plutôt du C que tu as écris). Ca tiendrait en quelques lignes ;o)
1
j'aurais bien aimé mais j'ai quelques contraintes!
Comme faire du c++ c et ne pas utiliser la STL!!!
-1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 juin 2005 à 00:43
...

Pour moi il faut que tu tiennes à jour en parallèle une structure de donnée (l'arbre) et le fichier... C'est la seule manière intelligente et qui ait un minimum de sens. Quand je mets des "//supprimer du fichier //maj le fichier" etc... il faut que tu définisse une fonction pour ces opérations. C'est elles (et pas les méthodes de la classes arbre) qui contiiennent les fseek et compagnie.

Bonne chance
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
29 juin 2005 à 01:00
Et moi je le decompresse comment ton ace si je suis sous linux ;o) Fais-moi un rar/zip/tar.gz/tar.bz2 mais pas un ace, un 7zip, un ice ou je ne sais quel format exotique ;o) Espèce de Windows corporate ^^

En tout cas félicitations ;) Et pour la beauté du code ça viendra avec la pratique.

Mais pour l'instant tu as plus appris du C que du C++... Pour ta culture de futur ingénieur tu peux commencer à regarder la STL et le concept de langage objet ce sera toujours ça de pris ^^
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
26 juin 2005 à 22:27
Haha lol ;o) Bon je viens de regarder un peu ton programme et il y a quelques trucs qui me choquent.

1) Pourquoi utilise tu des char[] et pas des std::string ?

2) Tu utilise des cout à la place des std::cout, ce qui sous entend que tu as fait un using namespace std. Ce genre de trucs, bien pratique, ne pas être fait dans un fichier que tu es suscpetible d'inclure (hpp,...). Si tu fais ça dans un cpp pas de problèmes par contre ;o)

3) Tu utilises des fseek & co. Ce qui sous entend que tu manipule directement le fichier. Je pense qu'il serait plus simple de charger tes deux fichiers textes dans une structure de donnée adéquate, et travailler sur ces structures. Et quand ta modification est terminée réécrire le fichier.

Tu diras de ma part à ton prof que ce qu'il vous faire est une abbération informatique ;o) Manipuler une bdd par un fichier texte, à la rigueur si elle est pas grosse, mais forcer ses élèves à programmer en C++ en leur interdisant la stl, c'est débile (ou alors fallait demander à programmer direct en C ;o)... Enfin bref ;o)

Peux-tu préciser un peu plus le format de tes deux fichiers (éventuellement un petit exemple) car la je suis pas sûr d'avoir bien compris ce que tu veux faire.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Je suis tout a fait d'accord avec toi!
En fait c'est surtout du c que l'on fait et du c++ tres tres basique
d'ou le cout etc.
Je t'explique :
J'ai deux fichiers txt,un index,et celui qui contient les données:
Le fichier index se présente comme ca:
chaque ligne posse:
un ID,un nom,le fils droit,le fils gauche(representation d'un arbre)
Concernant le fichier de donnée chaque ligne comporte:
nom,numero,adresse.
Grace au fichier index je retrouve les données dans l'autre fichier.
Mon probleme se trouve alors lors de l'ajout:
j'aoute mes données dans le second fichier en fin la il n'y a pas de soucis
or je dois aussi mettre a jour l'index:
L'index est un arbre donc je dois mettre a jour le pere et c'est la ou est le probleme je comptai mettre mon l'arbre du fichier dans un tableau pour
pouvoir retravailler tous ca mais je n'ai pas le droit je doit travailler uniquement sur le fichier d'ou mon idée :
identifier dans le fichier le pere ,change son fils droit ou son fils gauche suivant cas en indiquant l'ID de la nouvelle feuille
Puis recopier le fichier index dans un autre et lorsque en lisant mon fichier index je trouve Le pere j'ecris a la place celui que j'ai modifié!
d'ou ma boucle de copie mais la probleme la recopie se fait mal:
plusieurs fois la meme ligne,et les clé du pere ne sont pas changées!!
J'espere avoir été comprehensible sinon je te passe mon msn
mastaufff@msn.com pour te passer mon fichier et que tu voyes pas toi meme.

Merci encore
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 juin 2005 à 00:32
Oula pas d'adresse sur un forum malheureux ;o) Et moi msn ce n'est pas possible déontologiquement désolé ;o)

Ok bon pour le c++ basique, mais on va déjà faire du propre :


- Inclue tes fichiers sous la forme #include <iostream> (et non #include <iostream.h> si ce n'est as déjà fait.
- Tu peux arreter les char[40] nom --> tu fais des std::string.
- Tu peux arrêter les strcpy --> tu fais std::string s1,s2="plop"; s1=s2;
Essaie de mettre
- Tu peux arrêter les fopen & co en c++ on utilise les fstreams (même utilisation que cout pour les ofstream (écriture) et que cin pour les ifstream (lecture)).

Le pb en lui même :

Pour le format des fichiers j'ai capté. par contre je comprends toujours pas pourquoi tu ne charge pas ton fichier dans une structure de donnée (une classe d'arbre) adaptée, et ensuite que tu réecris le fichier...

L'index est un arbre donc je dois mettre a jour le pere et c'est la ou est le probleme je comptai mettre mon l'arbre du fichier dans un tableau pour
pouvoir retravailler tous ca mais je n'ai pas le droit je doit travailler uniquement sur le fichier d'ou mon idée :


Vérifie avec ton prof si ce n'est pas possible (si c'est non il a vraiment des exos zarbs)

Pour ce qui est de l'arbre si j'ai bien compris :

Fichier 1 :
un noeud par ligne au format :
id_noeud     id_noeud_fils_gauche     id_noeudfils_droit    nom


Fichier 2 :

des infos sur chaque nom au format
nom   numero    adresse. 


Voici le genre de classes que je te propose :
#include <string>

class noeud{
   public:
   noeud * fils_gauche;
   noeud * fils_droit;
  std::string nom;
   
   noeud(std::string nom0):nom(nom0){   }
};

class arbre{
    private:
    unsigned int id_dispo; //un id pour un nouveau noeud

    protected:
    noeud * racine;

    public:
    inline unsigned int get_id_dispo(){
       return id_dispo;
    }

    arbre():id_dispo(0),racine(0){}
    
    ~arbre{
       supprimer_noeud(racine);
    }

    void detruire_noeud(noeud *n);
    noeud * trouver_noeud(unsigned int id); //pour trouver l'adresse d'un noeud connaissant son identiifant
    bool ajouter_noeud(noeud *pere,std::string nom_fils);
    bool supprimer_noeud(unsigned int idnoeud);
};



Trois opérations possibles :

- mise à jour

facile il suffit de corriger la bonne ligne ;)

- suppression -> supprimer le noeud de l'arbre et ses fils :


void arbre::supprimer_noeud(noeud * n){
   if (n.fils_gauche){
       supprimer_noeud(n.fils_gauche);
   }
   if (noeud.fils_droit){
      supprimer_noeud(n.fils_gauche);
   }
   //supprimer le noeud n du fichier
   //....
}


- ajout


Bon là j'ai pas trop capté comment tu ajoutais ? Tu précise le noeud père ? Que se passe-t'il s'il a dejà deux fils ?
bool arbre::ajouter_noeud(noeud * pere,std::string fils){
   if (!pere.fils_gauche){
     pere.fils_gauche=noeud(fils,get_dispo());
     id_dispo++;
     //Ecrire dans les fichiers....
     return true;
  }
   if (!pere.fils_droit){
     pere.fils_droit=noeud(fils,get_dispo());
     id_dispo++;
     //Ecrire dans les fichiers....
     return true;
  }
  return false; //déjà deux fils !!
}
0
Merci bien pour toutes ces infos!!
Pour le fait de mettre dans une structure cela me parait evidant mais c'est un imperatif va savoir pourquoi!la seule reponse que j'ai reussi a avoir mais tres limite:
"Si le fichier est volumineu et que ca plante perte des données!!!"
jtrouve aberant mais bon !!!
Deuxiement pour mon system d'ajout c'est ce que j'avais fait durant un projet sur les arbres et qui fonctionnait tres bien!!!
Pour l'utilisation de std::string etc je vais me pencher la dessus et revoir les syntaxes pour améliorer le code!
Par ailleur j'ai fait les memes fonctions en y mettant dans un tableau pour le fichier index et ma fonction marche tres bien!
Je pense que la solution structure ou tableau reste la meilleur,la moins embetantes et la plus fluide meme si elle ne m'ai pas permis!
Pour ma fonction ajout apres de multiples debug un gros probleme reste a ce niveau la:
fseek(findex,0,SEEK_SET);
      findex_temp=fopen("findex_temp.txt","w");
      fread(&temp_index,sizeof(index),1,findex);
      while(fread(&temp_index,sizeof(index),1,findex)!=0)
      {
         if(temp_index.cle!=temp.cle)
         {
            fwrite(&temp_index,sizeof(index),1,findex_temp);
         }
         else{
            fwrite(&temp,sizeof(index),1,findex_temp);
         }
      };
      fwrite(&temp2,sizeof(index),1,findex_temp);
      fclose(findex);
      fclose(findex_temp);
      findex=fopen("index.txt","w");
      findex_temp=fopen("findex_temp.txt","r");
      fseek(findex_temp,0,SEEK_SET);
.
la mise a jour dans le fichier,probleme que je n'ai su resoudre qu'en
utilisant un tableau et recopiant le contenu dans le fichier!
De plus d'autres erreurs y sont comme appration de plusieurs lignes identiques et toujours aucun mise a jour du pere!!
Car pour ce qui est de la mise a jour comme tu le dis:
"il suffit de corriger la bonne ligne" et bien justement c'est celle la
qui me pose probleme depuis a peu pres 8h ce matin!
Je vais essayer de la trouver mais dans le cas contraire je pense opter
pour la solution la moins contraignante la structure!
Je te remercie pour ces explications
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 juin 2005 à 01:15
Merci bien pour toutes ces infos!!
Pour le fait de mettre dans une structure cela me parait evidant mais c'est un imperatif va savoir pourquoi!la seule reponse que j'ai reussi a avoir mais tres limite:
"Si le fichier est volumineu et que ca plante perte des données!!!"
jtrouve aberant mais bon !!!


--> C'est bidon soit un fichier ca prend quelques secondes a écrire, soit on utilise une base de donnée. Et tu peux rétorquer qu'en accès un fichier c'est vachement plus long.

Je pense que la solution structure ou tableau reste la meilleur,la moins embetantes et la plus fluide meme si elle ne m'ai pas permis!

--> Nooop pas tableau ;o) Il faut toujours avoir une structure cohérente avec ce sur quoi tu travailles. La c'est un arbre, donc tu fais une structure d'arbre ;o) Sinon tes futurs maitre de stages vont te haïr ;o)

la mise a jour dans le fichier,probleme que je n'ai su resoudre qu'en
utilisant un tableau et recopiant le contenu dans le fichier!


Ca ne m'étonne pas... Je t'avoue que je n'ai jamais utilisé un fichier pour stocker de l'info à l'intérieur d'un programme. Ce n'est jamais utilisé en pratique. Un fichier ca se charge et ca se sauve et c'est tout. Entre les deux on utilise une structure de donnée... justement pour eviter les fseek et accélerer l'accès ;o)

"il suffit de corriger la bonne ligne" et bien justement c'est celle la
qui me pose probleme depuis a peu pres 8h ce matin!

Tu fais un fseek pour te placer au bon endroit et ensuite tu fwrite. Mais si ce que tu écris est plus long (ou plus court ça fait de la merde). Peut-être en rajoutant plein d'espaces de sorte à avoir par exemple toujours 300 caractères par lignes ca peut le faire. Mais c'est vraiment une solution bidouile... Enfin bon vu le sujet ;)

Tu diras de ma part à ton prof que plutôt que de former ses élèves à faire un programme sans queue ni tête il faudrait vous former au réels besoin de l'informatique (par exemple le même exercice avec des ifstream ofstream, map et une vraie structure de donnée avec des belles classes), notions dont vous risquez d'avoir besoin plus tard plutôt que d'apprendre à utiliser des fsseek & co... Mais bon on peut aussi faire de l'assembleur tant qu'on y est ;o)

Bonne chance
0
bon si j'avais su j'aurais fait la structure bien avant et puis le but final c'est que ca marche!!!!
Pour le prof n'en parlons pas retranché derriere sa fameuse escuse:
"C'est le programme qui veut ca" les cours ne rimes a rien,
le C++ est plus de la bidouille qu'autre chose!!!
Me reste plus qu'a regler un petit probleme :
c:\windows\temp\class.cpp(414) : fatal error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1786) 
         Please choose the Technical Support command on the Visual C++ 
         Help menu, or open the Technical Support help file for more information
Error executing cl.exe.

main.exe - 1 error(s), 0 warning(s)

Mais bon ca au moins ca vient pas du projet!!!

Je te remercie pour le temps passé a me lire et a me repondre!
MErci a toi
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 juin 2005 à 01:54
Le pb c'est que sans structure on va en chier ;o) Je suis même pas sûr que ce soit faisable... Le C++ ce n'est pas de la bidouille (bien au contraire) et le programme c'est une chose, enseigner nimp c'en est une autre ;o) A ta place je repartirais sur des bases saines (ie structures+ objet comme je t'ai expliqué) même si ce n'est pas comlètement du goût de ton prof ;) Au moins tu auras une ébauche d ece qu'est le c++ ;o)

Internal compiler erreur ça m'arrive quand j'écris une grosse connerie qui n'a aucun sens (oui je suis mauvais par moment ;) ). Essaie de mettre des sections de code en commentaire /* ... */ afin de déterminer où ca foire... Sans doute l'un des trucs que tu viens de changer.

Au fait tu es en quelle année et dans quelle école si ce n'est pas indiscret ? ;o)

Bonne chance, moi je vais dormir un brin ^^
0
je suis en premier année d'iut informatique lyon.
Bon j'ai suivi un peu ce que tu m'as dit,et me suis renseigné au pres
des consigne et finalement il faut utiliser un tableau donc pour la fonction ajout j'y ai bossé la journée et elle marche enfin!!
je suis alors passé a supprimer le plus dure pour un arbre a mon gout!
j'ai codé ceci:
void index_bd::supprimer_bd(int cle)
{
		index temp;
		index pere;
		index fils_gauche;
		index fils_droit;
		int _pere;
		index *tableau;
		fseek(findex,(cle-1)*sizeof(index),SEEK_SET);
		fread(&temp,sizeof(index),1,findex);
		
				fseek(findex,0,SEEK_END);
			int n=ftell(findex)/sizeof(index);

			tableau=new index[n];
			fseek(findex,0,SEEK_SET);
			for(int i=0;i<n;i++)
			{
			fread(&(tableau[i]),sizeof(index),1,findex);
			}

		_pere=obtenir_le_pere(cle);
		fseek(findex,(_pere-1)*sizeof(index),SEEK_SET);
		fread(&pere,sizeof(index),1,findex);


		if(temp.cle_droite==0 && temp.cle_gauche==0)
		{
			if(pere.cle_droite==temp.cle)
			{
				tableau[_pere-1].cle_droite=0;
			}
			else
			{
				tableau[_pere-1].cle_gauche=0;
			}
		}
		else
			if(temp.cle_droite==0 || temp.cle_gauche==0)
			{
				if(temp.cle_droite==0)
				{
					if(pere.cle_droite==temp.cle)
						tableau[_pere-1].cle_droite=temp.cle_gauche;
					else
						tableau[_pere-1].cle_gauche=temp.cle_gauche;
				}
				else{
					if(pere.cle_droite==temp.cle)
						tableau[_pere-1].cle_droite=temp.cle_droite;
					else
						tableau[_pere-1].cle_gauche=temp.cle_droite;
				}
			}

			if(temp.cle_gauche!=0&&temp.cle_droite!=0)
			{
						int max=obtenir_plus_grand_fils(temp.cle_gauche);
						int min=obtenir_plus_petit_fils(temp.cle_droite);
						fseek(findex,(max-1)*sizeof(index),SEEK_SET);
						fread(&fils_gauche,sizeof(index),1,findex); 
						fseek(findex,(min-1)*sizeof(index),SEEK_SET);
						fread(&fils_droit,sizeof(index),1,findex);
						

		if (strcmp(tableau[max-1].nom,tableau[min-1].nom)>0)
		{
				tableau[max-1].cle_gauche=min-1;
		}
		else
		{
				tableau[max-1].cle_droite=min-1;
		}
		
		if (strcmp(temp.nom,tableau[_pere-1].nom))
		{
			tableau[_pere-1].cle_gauche=temp.cle_gauche;
		}
		else
		{
				tableau[_pere-1].cle_droite=temp.cle_gauche;
		}
	}
		for (i=0;i<n;i++)
			{
		if (tableau[i].cle_droite>=(temp.cle)+1)
			tableau[i].cle_droite=(tableau[i].cle_droite)-1;
		if (tableau[i].cle_gauche>=(temp.cle)+1)
			tableau[i].cle_gauche=(tableau[i].cle_gauche)-1;
		if (tableau[i].cle>=(temp.cle)+1)
			tableau[i].cle=(tableau[i].cle)-1;
			}
	mise_a_jour_supprimer(tableau,temp);

		
}


int index_bd::obtenir_le_pere(int cle)
{
	index buffer;
	
	fseek(findex,0,SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);
	while(buffer.cle_droite!=cle && buffer.cle_gauche!=cle)
	{
		fread(&buffer,sizeof(index),1,findex);
	}
	return(buffer.cle);
}

int index_bd::obtenir_plus_grand_fils(int n)
{
	index buffer;
	fseek(findex,(n)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);
	int fils=buffer.cle_gauche;
	fseek(findex,(fils)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);
	
	while (buffer.cle_droite!=0)
	{
		fseek(findex,(buffer.cle_droite)*sizeof(index),SEEK_SET);
		fread(&buffer,sizeof(index),1,findex);
	}
	return(buffer.cle);
}

int index_bd::obtenir_plus_petit_fils(int n)
{
	index buffer;
	index temp;

	fseek(findex,(n-1)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);	
	fseek(findex,(buffer.cle_droite-1)*sizeof(index),SEEK_SET);
	fread(&temp,sizeof(index),1,findex);
	
	while (temp.cle_gauche!=0)
	{
		fseek(findex,(temp.cle_gauche-1)*sizeof(index),SEEK_SET);
		fread(&temp,sizeof(index),1,findex);
	}
	return (temp.cle);
}


La fonction marche pour les noeud n'ayant pas de fils,ou pas de fils droit ou pas de fils gauche.
le probleme intervient la dans un noeud interne.
Il boucle indefiniment et ne prend pas les bonnes valeurs je cherche mon erreur ou plutot mes ereurs mais je bloque un peu j'ai situé le probleme:
			if(temp.cle_gauche!=0&&temp.cle_droite!=0)
			{
						int max=obtenir_plus_grand_fils(temp.cle_gauche);
						int min=obtenir_plus_petit_fils(temp.cle_droite);
						fseek(findex,(max-1)*sizeof(index),SEEK_SET);
						fread(&fils_gauche,sizeof(index),1,findex); 
						fseek(findex,(min-1)*sizeof(index),SEEK_SET);
						fread(&fils_droit,sizeof(index),1,findex);
						

		if (strcmp(tableau[max-1].nom,tableau[min-1].nom)>0)
		{
				tableau[max-1].cle_gauche=min-1;
		}
		else
		{
				tableau[max-1].cle_droite=min-1;
		}
		
		if (strcmp(temp.nom,tableau[_pere-1].nom))
		{
			tableau[_pere-1].cle_gauche=temp.cle_gauche;
		}
		else
		{
				tableau[_pere-1].cle_droite=temp.cle_gauche;
		}
	}
		for (i=0;i<n;i++)
			{
		if (tableau[i].cle_droite>=(temp.cle)+1)
			tableau[i].cle_droite=(tableau[i].cle_droite)-1;
		if (tableau[i].cle_gauche>=(temp.cle)+1)
			tableau[i].cle_gauche=(tableau[i].cle_gauche)-1;
		if (tableau[i].cle>=(temp.cle)+1)
			tableau[i].cle=(tableau[i].cle)-1;
			}
	mise_a_jour_supprimer(tableau,temp);

		
}


int index_bd::obtenir_le_pere(int cle)
{
	index buffer;
	
	fseek(findex,0,SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);
	while(buffer.cle_droite!=cle && buffer.cle_gauche!=cle)
	{
		fread(&buffer,sizeof(index),1,findex);
	}
	return(buffer.cle);
}

int index_bd::obtenir_plus_grand_fils(int n)
{
	index buffer;
	fseek(findex,(n)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);
	int fils=buffer.cle_gauche;
	fseek(findex,(fils)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);
	
	while (buffer.cle_droite!=0)
	{
		fseek(findex,(buffer.cle_droite)*sizeof(index),SEEK_SET);
		fread(&buffer,sizeof(index),1,findex);
	}
	return(buffer.cle);
}

int index_bd::obtenir_plus_petit_fils(int n)
{
	index buffer;
	index temp;

	fseek(findex,(n-1)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);	
	fseek(findex,(buffer.cle_droite-1)*sizeof(index),SEEK_SET);
	fread(&temp,sizeof(index),1,findex);
	
	while (temp.cle_gauche!=0)
	{
		fseek(findex,(temp.cle_gauche-1)*sizeof(index),SEEK_SET);
		fread(&temp,sizeof(index),1,findex);
	}
	return (temp.cle);
}

dans la fonction plus grand fils car il ne prend pas la bonne valeur pour la clé au debug mais pourquoi je ne vois toujours pas....
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
28 juin 2005 à 00:30
Je n'ai pas regardé dans le détail, mais je pense que si tu recherche les deux dans ton fichier, puis que tu en supprime un, le deuxième risque de se décaler dans ton fichier d'où le problème. A ta place je ferais une fonction récursive comme indiqué plus haut.

void supprimer_noeud(noeud * n){
supprimer_noeud(n->fils_gauche);
supprimer_noeud(n->fils_droit);
findex=chercher(n); //fseek & co
effacer_du_fichier(findex);//Supprime du fichier la ligne a cet index
}

Tu vas faire une descente récursive gauche, et arrivée au fils gauche, puis une fois trouvé tu le repère et le supprime. Tu degommes ensuite le fils droit et tu remonte d'un noeud... etc... Et là ton index est calculé juste avant la suppression donc pas de pb.

Maintenant la vérité est peut-être ailleurs ;)
0
Merci!
alors j'ai lu dans le detail ton message et je vais le lire plusieurs fois avant de bien le comprend!
J'ai bien apprecier la petite touche d'humour a la fin!!
Merci bien.

PS:si j'arrive a finir ce ... de projet je mettrais la source mais bon le finir avant mercredi ca va etre chaud !!!!
Merci encore
0
En fait ce que je ne comprend pas c'est que lorsque je lance mes fonctions:
						int max=obtenir_plus_grand_fils(temp.cle_gauche);
						int min=obtenir_plus_petit_fils(temp.cle_droite);


j'obtiens des valeurs pour la cle lorsqu'il lit le buffer de l'ordre de 2408 etc...:
	fseek(findex,(n-1)*sizeof(index),SEEK_SET);
	fread(&buffer,sizeof(index),1,findex);

Des fois il passe impecable mais desfois il me sorts des valeurs comme celle ci au debug ce qui parait vraiment etonnant vu que je ne change pas le fichier et que normalement la lecture est la meme.
J'ai donc tenté de me repositionné au debut du fichier avant de me positionner a la bonne ligne mais rien n'y change le nombre reste aléatoire....ce qui alors devient genant voir completement farfelue
pour la suite et entraine une boucle infini dans la suite de la fonction
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
28 juin 2005 à 22:31
Pour supprimer tes noeud fils il faut commencer par le bas et remonter progressivement (la fameuse descente recursive dont je parlais pus haut), comme ça tu es sûr de ne pas en oublier. Si ta procédure est clean pour un fils quelle que soit sa position dans le fichier, et que tu réinitialises ton pointeur de fichier correctement après une suppression, il ne doit pas y avoir de problème.

Malheureusement pour le debug je ne pas t'aider beaucoup plus :/
0
J'ai donc resolu tous mes problemes mon programme est disponible la:
http://mastaufff.free.fr/projet%20c++/projet%20bd.ace
J'ai résolu 99.9% de mes problémes,la seule qui reste est la suppression
de la racine qui me supprime l'arbre en entier,mais bon je verrai si j'ai le temps de resoudre tous cela il reste encore a finir le dossier que mon binome "aurait" du finir!!
Si tu regardes la source je pense que tu trouveras ca trés mal codé et qu'il y aurait bien plus simple (il y a toujours plus simple)!!
Merci encore pour l'aide et les indications qui m'ont permis d'avancer
0
hihi désolé pour le type de fichier mais j'aime bience qui est exotique ;)
le voila:
http://mastaufff.free.fr/projet%20c++/projet.rar

Par manque de temps je n'ai pas pu me pencher sur la STL mais deux mois de vacances vont permettre de bosser tous ca et peut etre aussi
de passer a linux qui sait.
Ah oui aussi d'apprendre a faire moins de fautes d'orthographe!!!
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
29 juin 2005 à 01:13
J'arrive pas à le décompresser ;o)(il ne suffit pas de changer l'extension, hein ;o)) Fais-moi un beau zip fait à partir de tes fichiers d'origine.

Pour les fautes d'orthographes j'ai vu pire mais c'est super important quand même ;) Et linux c'est un investissement personnel mais ça vaut vraiment le coup (surtout vu la formation que tu suis ;) ).
0
Bon ca devrait etre bon normalement le rar doit etre bien fait
je l'ai fait avec w*nrar!!!
http://mastaufff.free.fr/projet%20c++/projet.rar

Jesepere que ca ira sinon j'installe vite fait linux et je recompresse tout
ca ;)
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
30 juin 2005 à 19:18
C'est pas mal pour une première fois ;) Même très bien ;) Encore félicitations ^^

Attention à quelques trucs tout de mêmes :

1) On ne met pas de code dans les .h, juste les prototypes + interfaces : Ex :
int f(int x1,y1);

Le code est mis dans un .cpp qui inclue le .h (.hpp même). Le seul cas où le code est dans les hpp c'est pour les templates...

2)Pour les interfaces, essaye d'utiliser la syntaxe doxygen. Voici les balises de base :
/**
* \brief un résumé du rôle de ma fonction.
* \param x1 le premier paramètre
* \param y1 le deuxième paramètre
* \return Ca retourne un truc ;o)
* \todo Les améliorations à apporter à la fonction
* \sa Les fichiers ou regarder pour plus de détails
*/

Comme ça tu générera directement ce que tu as en fait mis dans ton rapport ;o) En latex, en html la total ^^

3) Il aurait été bien de faire un makefile. Je te laisse regarder les tutos sur le Net... C'est un outil très pratique ;)

4) Ton code est bien indenté, lisible, et aéré donc ça c'est bien. Qui plus est tu as fait l'effort de faire des modules et ça c'est bien .

Excellente continuation, et j'espère que tu passeras sous linux ;)
0
Utilisateur anonyme
30 août 2005 à 13:16
bonjour .g vu le sujet sur le google .votre projet m' est très utile.
le problème c que l adresse où on peut trouver le code est introuvable.
est ce que vous pouver me renseigner sur l adresse correcte ou simplement me l envoyer par e-mail:le mien hamdi_souma@yahoo.fr
merci d avance.
0