Posté(e) le 13 mai 200421 a 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"); }
Posté(e) le 13 mai 200421 a 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 }
Posté(e) le 13 mai 200421 a 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
Posté(e) le 13 mai 200421 a Auteur merci de me répondre mais je ne vois pas trop comment faire ce que je voudrai c est trouver mon erreur ...
Posté(e) le 13 mai 200421 a 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 ...
Posté(e) le 13 mai 200421 a Auteur 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
Posté(e) le 13 mai 200421 a 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 )
Posté(e) le 14 mai 200421 a 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.
Posté(e) le 18 mai 200421 a 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
Posté(e) le 20 mai 200421 a Auteur 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
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.