Aller au contenu

Problème de suppression physique en C

Featured Replies

Posté(e)

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");
}

Posté(e)

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)

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)
  • 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)

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)
  • 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)

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)

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)

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

Posté(e)
  • 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.