NiTrOuS Posté(e) le 13 mai 2004 Partager Posté(e) le 13 mai 2004 Voilà j ai un programme qui gère des clients Je crée donc des fiches client via mon programme et ces fiches sont stockées dans le fichier "client.dat" Quand je veux les supprimer, tout d abord je fais un suppression logique, je met un champ de ma structure a 1 au lieu de 0 et lors de l affichage des fiches, ne sont prises en comptes que les fiches dont ce champ a la valeur 0 ... soit rien de plus simple seulement, il nous est demandé de faire une suppression physique j appele donc ma fonction de suppression physique lors de la fermeture de mon programme, mais le probleme et qu il me recopie deux fois la derniere fiche :( je ne trouve pas mon erreur, si quelqu un pouvait m aider ce serait gentil de sa part (hein sentinel ) void suppresion_physique(struct enreg *a) { char tmp[2]={"0"}; FILE *f; FILE *z; f=fopen("client.dat","rb"); z=fopen("temp.dat","wb"); while(!feof(f)) { fread(a,sizeof(*a),1,f); if(strcmp((*a).del,tmp)==0) { fwrite(a,sizeof(*a),1,z); } } fclose(f); fclose(z); remove("client.dat"); rename("temp.dat","client.dat"); } Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 13 mai 2004 Partager Posté(e) le 13 mai 2004 Pourquoi ne pas faire une méthode du genre : en "pseudo_c" void Suppression_fiche (int Ident_fiche_suppr) { ouvrir Fic1 en lecture ouvrir Fic2 en écriture tant que non fin de fichier (Fic1) { Lire (Fic1, Fiche_lue) Si Fiche_lue.Ident_fiche != Ident_fiche_suppr alors ecrire (Fic2, Fiche_lue) } Fermer Fic1, Fic2 } Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 13 mai 2004 Partager Posté(e) le 13 mai 2004 Je pense même que tu peux utiliser qu'un seul fichier que tu ouvres en lecture/ecriture mais il te faudra utiliser la methode seek qui te permet de te positionner à un endroit du fichier et filepos (j'espère que c'est bien ce nom) qui te donne la position à laquelle tu es dans le fichier voila en gros, ce que ca donne, désolé, je n'ai pas trop le temps de chercher..... mais ca devrait t'aider void Suppression_fiche (int Ident_fiche_suppr) { ouvrir Fic1 en lecture/ecriture tant que non fin de fichier (Fic1) { Lire (Fic1, Fiche_lue) Si Fiche_lue.Ident_fiche == Ident_fiche_suppr alors seek (Fic1, filepos(Fic1) - sizeof (Fiche_lue)) // à voir si j'ai bon.... } // à voir si ça fonctionne dans le cas où la fiche supprimée est la dernière // faut rajouter un test Fermer Fic1 } ca t'evitera de supprimer l'ancien puis de renommer le nouveau Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 13 mai 2004 Auteur Partager Posté(e) le 13 mai 2004 merci de me répondre mais je ne vois pas trop comment faire ce que je voudrai c est trouver mon erreur ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
mogwai93 Posté(e) le 13 mai 2004 Partager Posté(e) le 13 mai 2004 ton fichier client.dat ne contiendrait pas 2 fois la même entrée ?? Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 13 mai 2004 Auteur Partager Posté(e) le 13 mai 2004 non ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
fifx Posté(e) le 13 mai 2004 Partager Posté(e) le 13 mai 2004 Nitrous > tu peux nous dévoiler un peu plus de code ? Sur ta fonction il n'y a pas grand chose a redire ... L'erreur se trouve peut être autre part ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 13 mai 2004 Auteur Partager Posté(e) le 13 mai 2004 Je l ai mis sur mon serveur en entier comme ca vous verrez par vous meme Ma fonction de suppression est appelée au début dans void main quand on quitte le programme (i=3) et la fonction se trouve tout à la fin Lien vers le commentaire Partager sur d’autres sites More sharing options...
fifx Posté(e) le 13 mai 2004 Partager Posté(e) le 13 mai 2004 Comment tu le sais que ta derniere fiche est recopiée 2 fois ? en affichant le contenu du fichier ou en comparant la taille réel de tes fichiers ?? NB : pour le champ del de ta structure, c'est préférable d'utiliser un int, car quand tu fait des compairaisons, tu pourrai te tromper ( '0' est différent d'un tableau del[2]={"0"}; car ton tableau contient : 0 + \0 ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 14 mai 2004 Auteur Partager Posté(e) le 14 mai 2004 Ca le fait quand je réaffiche le fichier Lien vers le commentaire Partager sur d’autres sites More sharing options...
fifx Posté(e) le 14 mai 2004 Partager Posté(e) le 14 mai 2004 Une structure "enreg" doit prendre normalement 144 octets sur ton fichier. Compare ton fichier avant et apres la suppression pour voir si celle-ci a bien été effacée. Si ton fichier fait 144 octets en moins, il y a une structure "enreg" en moins sur ton fichier. Dans ce cas, la, ton erreur viens de ton affichage. Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 15 mai 2004 Auteur Partager Posté(e) le 15 mai 2004 ha ouai pas bete je vais regarder a ca tout de suite Lien vers le commentaire Partager sur d’autres sites More sharing options...
BlipBlop Posté(e) le 18 mai 2004 Partager Posté(e) le 18 mai 2004 Tu sais ce que je fais quand j'ai la forte impression que mon programme est juste et que c'est la machine qui fait n'importe quoi? --> debugger... C'est long mais au moins tu sera exactement la ou ca foire, et donc on pourra t'aider plus facilement... Bonne chance Lien vers le commentaire Partager sur d’autres sites More sharing options...
NiTrOuS Posté(e) le 20 mai 2004 Auteur Partager Posté(e) le 20 mai 2004 C est bon j ai résolu le probleme ... En fait dans ma fonction de suppression je lis d abord tout le fichier avec un compteur qui compte le nombre de fiches, un compteur qui compte le nombre de fiches a supprimer et un compteur qui compte ce qui est recopié ... Si il n y a pas de fiche a supprimer physiquement, la fonction ne fait rien, si il y en a, ca rentre dans une boucle Voila merci pour votre aide Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.