Supprimer un enregistrement en C

Fermé
dim12 - 9 juin 2010 à 10:03
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 9 juin 2010 à 14:45
Bonjour à tout le monde,

J'ai besoin de votre aide svp.
J'ai un problème de suppression dans le programme ci-dessous, je ne vois pas pourquoi il ne supprime pas un enregistrement dans le fichier!!!

Merci d'avance.

Voici mon programme, le problème est dans (void ondelete_file()) je l'ai mis en gras:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>

/***********DEFINITION DE VARIABLES GLOBALES**********************/

struct carnet
{
char reference[8];
char description[32];
int codePostal;
char ville[15];;
int surface;
int prix;
}appartement[100];

int compteur=0;
int i,trouve,choix;
char key;

/***************************FONCTION PRINCIPAL**************************************/

void menu();/*prototype*/

main()
{
menu();

}



/********************************AJOUT*****************************************************/

void add_record()
{
i=compteur;
printf("\n----------------------------AJOUT D UN ENREGISTREMENT--------------------\n");
fflush(stdin);
printf("REFERENCE\n");
gets(appartement[i].reference);
fflush(stdin);
printf("DESCRIPTION\n");
gets(appartement[i].description);
fflush(stdin);
printf("CODE POSTAL\n");
scanf("%d",&appartement[i].codePostal);
fflush(stdin);
printf("VILLE\n");
gets(appartement[i].ville);
fflush(stdin);
printf("SURFACE\n");
scanf("%d",&appartement[i].surface);
fflush(stdin);
printf("PRIX\n");
scanf("%d",&appartement[i].prix);
fflush(stdin);
compteur++ ;
main();
}
/*********************************SUPPRESSION RECORD***************************************/

void delete_record()
{
char delnom[32];
int j;
trouve=0;
fflush(stdin);
printf("\n--------------------------------SUPPRESSION------------------------------\n");
printf("Entrer la reference l'enregistrement à supprimer \n");
gets(delnom);
fflush(stdin);


for(i=0;i<compteur;i++)
{
if (strcmp(appartement[i].reference,delnom)==0)
{
printf("Reference de l'appartement a supprimer ? : \n");
printf(" : %s \n",appartement[i].reference);
printf(" : %s \n",appartement[i].description);
printf(" : %d \n",appartement[i].codePostal);
printf(" : %s \n",appartement[i].ville);
printf(" : %d \n",appartement[i].surface);
printf(" : %d \n",appartement[i].prix);
printf("Voulez vous vraiment supprimer cet appartement ? 1 OUI 2 NON\n");
scanf("%d",&choix);

if (choix==1)
{
printf("L'appartement a bien ete supprime : %s \n",appartement[i].reference);
trouve++;

for (j=i;j<compteur;j++)
{
strcpy(appartement[j].reference,appartement[j+1].reference);
strcpy(appartement[j].description,appartement[j+1].description);
appartement[j].codePostal,appartement[j+1].codePostal;
strcpy(appartement[j].ville,appartement[j+1].ville);
appartement[j].surface,appartement[j+1].surface;
appartement[j].prix,appartement[j+1].prix;
}
} /*fin du if strcmp*/
} /*fin du for*/

if (trouve==0)
printf("Aucun appartement supprime\n");

compteur-=trouve;
key=getch();
main();
}
}
/*******************************MODIFICATION RECORD****************************************/

void modify_record()
{
char modifynom[32];
trouve=0;
fflush(stdin);
printf("\n------------------------------MODIFICATION--------------------------------\n");
printf("Entrer le nom de l'appartement a modifier \n");
gets(modifynom);
fflush(stdin);


for(i=0;i<compteur;i++)
{
if (strcmp(appartement[i].reference,modifynom)==0)
{
printf("Reference de l'appartement a modifier ? : \n",i);
printf(" : %s \n",appartement[i].reference);
printf(" : %s \n",appartement[i].description);
printf(" : %d \n",appartement[i].codePostal);
printf(" : %s \n",appartement[i].ville);
printf(" : %d \n",appartement[i].surface);
printf(" : %d \n",appartement[i].prix);
printf("Voulez vous modifier cet appartement ? 1 OUI 2 NON\n");
scanf("%d",&choix);

if (choix==1)
{
trouve++;
fflush(stdin);
printf("REFERENCE\n");
gets(appartement[i].reference);
fflush(stdin);
printf("DESCRIPTION\n");
gets(appartement[i].description);
fflush(stdin);
printf("CODE POSTAL\n");
scanf("%d",&appartement[i].codePostal);
fflush(stdin);
printf("VILLE\n");
gets(appartement[i].ville);
fflush(stdin);
printf("SURFACE\n");
scanf("%d",&appartement[i].surface);
fflush(stdin);
printf("PRIX\n");
scanf("%d",&appartement[i].prix);
fflush(stdin);
} /*fin du if (boole==1)*/
}
} /*fin du for*/
if (trouve==0)
printf("Aucun appartement modifie \n");

key=getch();
menu();
}


/***********************AFFICHAGE TRIE PAR NOM***********************************/

void display()
{
// trialpha();
printf("\n--------------------AFFICHAGE DES APPARTEMENTS------------------------\n");

if (compteur!=0)
{
for (i=0;i<compteur;i++)
{
printf("\nAPPARTEMENT NUMERO : %d \n",i+1);
printf("REFERENCE : %s \n",appartement[i].reference);
printf("DESCRITPION : %s \n",appartement[i].description);
printf("CP : %d \n",appartement[i].codePostal);
printf("VILLE : %s \n",appartement[i].ville);
printf("SURFACE : %d \n",appartement[i].surface);
printf("PRIX : %d \n",appartement[i].prix);
}
}
else printf("Aucun appartement en memoire\n");
key=getch();
main();

}


/*********************NOMBRE DE RECORD EN MEMOIRE********************************/

void numberrecord()
{
printf("Nombre d'appartements en memoire : %d \n",compteur);
key=getch();
menu();
}
/**************************SAUVEGARDE EN FICHIER*****************************/

void write_file()
{

FILE * fichier;
int choice;
trouve = 0;

printf("\n-----------------------SAUVEGARDE ET SORTIE------------------------------\n");
printf("Sauvegarde des appartements dans le fichier AppartementsV1.txt\n");
key=getch();


fichier=(fopen("AppartementsV1.txt","a+")) ;

if (fichier==NULL)
{
printf("fichier non cree");
system("pause");
}


else
{
fflush(stdin);
for(i=0;i<compteur;i++)
{
fprintf(fichier,"REFERENCE : %s \n",appartement[i].reference);
fprintf(fichier,"DESCRIPTION : %s \n",appartement[i].description);
fprintf(fichier,"CODE POSTAL : %d \n",appartement[i].codePostal);
fprintf(fichier,"VILLE : %s \n",appartement[i].ville);
fprintf(fichier,"SURFACE en m3 : %d \n",appartement[i].surface);
fprintf(fichier,"PRIX : %d \n",appartement[i].prix);
fprintf(fichier,"\n--------------------------------------------------\n");
trouve++;
}
}


compteur-=trouve;
fclose(fichier);
printf("Sauvegarde dans AppartementV1.txt effectuee\n");
key=getch() ;
main();



}

/***************************************************************************/
void display_file()
{
FILE *fichier;
char buffer;



if((fichier = fopen("AppartementsV1.txt", "r")) == NULL) //on ouvre le fichier et verifie si on y arrive
{
printf("Fichier inexistant ou erreur\n");
}
else
{
//si on arrive a ouvrire le fichier tant que l'on est pas a la fin (feof = le premier f g oublier mais les autres c'est End Of File)
while (!feof(fichier))
{
fread(&buffer,1,1, fichier); //on range les caractere dans le buffer
if(buffer == '\0') //si c'est la fin de la ligne
{
printf("\n"); //on "affiche" un saut de ligne
}
printf("%c",buffer); //on affiche ce que contient le buffer

}
fclose(fichier);
}
fflush(stdin);
key=getch() ;
main();
}
/**************************************************************************************/
void ondelete_file()
{


FILE *fichier, *OUTFILE;
char delname[32];
do
{
fichier = fopen("AppartementsV1.txt", "r");
if (!fichier)
printf("ERREUR: Impossible d'ouvrir le fichier: \n");
}
while (!fichier);
do
{

OUTFILE = fopen("AppartementsV2.txt", "w");
if (!OUTFILE)
printf("ERREUR: Impossible d'ouvrir fichier: \n");
}
while (!OUTFILE);
/* Saisie de l'enregistrement à supprimer */
printf("Entrez la reference de l'appartement a supprimer : ");
scanf("%s",delname);
/* Traitement */
/* Copie de tous les enregistrements à */
/* l'exception de celui à supprimer. */
i=0;
while (!feof(fichier))
{

fscanf(fichier, "%s\n", appartement[i].reference);

if (strcmp(appartement[i].reference, delname) != 0)
{
fprintf(OUTFILE, "%s\n", appartement[i].reference);
fprintf(OUTFILE, "%s\n", appartement[i].description);
fprintf(OUTFILE, "%d\n", appartement[i].codePostal);
fprintf(OUTFILE, "%s\n", appartement[i].ville);
fprintf(OUTFILE, "%d\n", appartement[i].surface) ;
fprintf(OUTFILE, "%d\n", appartement[i].prix) ;
}
i++;
}
/* Fermeture des fichiers */
fclose(OUTFILE);
fclose(fichier);
key=getch();
main();

}


/**********************************USER MENU**************************************/

void menu()
{

printf("\n--------GESTION D'APPARTEMENTS--------\n");
printf("Choisir une option\n");
printf("\n1.Ajouter un appartement\n");
printf("2.Supprimer un appartement en memoire\n");
printf("3.Supprimer un appartement dans le fichier\n"); //marche pas
printf("4.Modifier un appartement en memoire\n");
printf("5.Afficher les appartement en memoire\n");
printf("6.Afficher les appartments en fichier\n");
printf("7.sauvegarder en fichier et sortir\n");
printf("8.Quitter\n");
scanf("%d",&choix);

switch(choix)
{
case 1:add_record();
break;
case 2:delete_record();
break;
case 3:ondelete_file();
break;
case 4:modify_record();
break;
case 5:display();
break;
case 6:display_file();
break;
case 7:write_file();
break;
case 8: exit(0);
break;
default : printf("veuillez entrer un chiffre entre 1 et 9\n\n");
menu();

}
//fflush(stdin);
}

1 réponse

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 juin 2010 à 10:51
Salut.
C'est ça qui ne va pas :
fscanf(fichier, "%s\n", appartement[i].reference);

if (strcmp(appartement[i].reference, delname) != 0)
{
fprintf(OUTFILE, "%s\n", appartement[i].reference);
fprintf(OUTFILE, "%s\n", appartement[i].description);
fprintf(OUTFILE, "%d\n", appartement[i].codePostal);

Je ne suis pas sur de comprendre, mais pose toi ces questions et réponds y :
Qui as t'il dans appartement[i].reference après le scanf ? S'il n'y a que la référence, le if suivant est ok, mais comment est remplis appartement[i].description et autre variables ?
Si appartement[i].reference contient toute la ligne (avec appartement[i].description etc.) le if ne peut pas fonctionner.
Pourquoi ne renommes tu pas appartementV2 en appartementV1. La boucle de lecture de V1 infinie, c'est très mauvais, imagine que le fichier est supprimé, ton programme tombe dans une boucle inifinie. La gestion de l'erreur n'est pas bonne.
Autre remarque, ta manière de boucler est mauvaise : à chaque fin de fonction, tu appels menu() ou main(), c'est à dire que tu ne sort jamais de la fonction appelante et tu enchaines les appels de fonctions. Problèmes que cela cause :
1- je ne suis pas sur que tu puisses imbriquer un nombre infinie de fonction, au bout d'un moment ça plante (à vérifier)
2- ton programme va prendre de plus en plus de place, car les variables ne sont pas détruites (on ne sort jamais de la fonction) et de nouvelles sont crées.

Pourquoi te limiter à 100 appartement, mieu faudrait faire un pointeur avec une liste chainé.

Pas mal de choses à revoir.
0
Merci pour ta réponse et tes remarques Char Snipeur.
Mais as tu une solution juste pour pouvoir supprimer dans le fichier?

Merci encore.
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
9 juin 2010 à 13:40
Pour supprimer une partie d'un fichier, la méthode est la même que pour en ajouter:
https://forums.commentcamarche.net/forum/affich-16245372-ecrire-dans-un-fichier-en-c-c
Ouvrir un fichier plus un nouveau, en recopier une partie, en sauter une autre et recopier le reste.
Bonne continuation.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 juin 2010 à 14:45
L'esprit de ce que tu fait n'est pas mal. Mais comme je pense que globalement, il faudrait revoir pas mal de chose, je ne veux pas te donner une bidouille. En plus, je ne suis pas très à l'aise avec scanf... Je ne sais pas si tu lis les espaces ou non.
Il y a deux façon de faire ce que tu veux faire.
1- tu lit la ligne entière. Tu isoles la référence pour la comparer. Tu copie la ligne entière dans le nouveau fichier.
2- tu récupère tout les champ indépendamment (c'est à dire scanf avec 6 arguments). Tu compare la référence, tu réécris tout tes champs.
0