Posted May 13, 200421 yr 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"); }
May 13, 200421 yr 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 }
May 13, 200421 yr 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
May 13, 200421 yr Author merci de me répondre mais je ne vois pas trop comment faire ce que je voudrai c est trouver mon erreur ...
May 13, 200421 yr 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 ...
May 13, 200421 yr Author 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
May 13, 200421 yr 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 )
May 14, 200421 yr 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.
May 18, 200421 yr 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
May 20, 200421 yr Author 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
Archived
This topic is now archived and is closed to further replies.