Aller au contenu

Problème de suppression physique en C


NiTrOuS

Messages recommandés

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 :yes: )

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

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

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

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

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

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 :-D

Lien vers le commentaire
Partager sur d’autres sites

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

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...