Problème dans une fonction en Langage C

Fermé
Hamid - 4 mai 2007 à 00:06
khalmen22 Messages postés 4 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 24 mai 2008 - 24 mai 2008 à 21:32
bonjour
ci dessous, une fonction que j'ai faite pour mon projet. Cette fonction à pour role de suprimer un nom dans un fichier qui contient un ensemble de nom.

au début, une lecture de chaque ligne et la suppression de retour chariot " \n " (cahque ligne contien un seul nom)
- après je recopie tout les noms dans un tableau de chaine de caractère
- supprimer le nom voulu et le remplacer par "NULL"
- et a la fin je recopie les noms de tableau dans le fichier liste.

en compilant, le programme fonctionne bien avec un seul nom dans la liste, parcontre, avec plus de 3 noms, cette fonction ne fonctionne pas bien, et elle supprime tout les noms sans décrementer le nombre nb_adher (sachant que cette fonction est faite pour supprimer un seul nom a chaque appel, et que dans la liste y a pas de nom identique)


Ma question:

Est ce que vous pouvez vérifier cette fonction, et de me faire toute les remarque en vu de régler mon problème et d'améliorer cette fonction.


//////la fonction:


//Fonctioin qui supprime un adhérent

int supprimer(char *nom_sup)
{
char nom[20];
FILE *fich;
FILE *liste;
char *nomListe[nb_adher];
int i, length;

fich = fopen("liste_adher", "r");
//copie de contenu de fichier liste dans le tableau de chaine de caractères
for (i=0; i<nb_adher; i++) //nb_adher: nombre d'adhérent
{
fgets(nom,20,fich); // Lecture d'un nom dans le fichier liste
remove_cr(nom); // Supprimer le retour chariot "\n"
length = strlen(nom);
nomListe[i]=malloc(length); //nomListe pointe sur un tableau de type char dont
//la taille correspond au nom lu ds le fichier
strcpy(nomListe[i], nom); //copie le contenu de nom ds nomListe
}
fclose(fich);

//supprimer un nom
for (i=0; i<nb_adher; i++)
{
if (strcmp(nomListe[i],nom_sup)==0)
{
nomListe[i]=NULL;
remove(nom_sup); //supprimer la fiche d el'adhérent
printf("\nAdherent supprimé\n");
nb_adher--; //mise à jour de nombre d'adhérent
}
}

// Mise à jour de la liste des adhérents après la suppression
if ((liste = fopen("liste_adher", "w")) == NULL)
{
fprintf(stdout, "Erreur Ã* l'ouverture du fichier en mode w.\n");
exit(0);
}

else
{
for (i=0; i<nb_adher; i++)
{
if (nomListe[i]!=NULL)
fprintf(liste, "%s\n", (nomListe[i])); //Ecriture de nom dans la liste
fclose(liste); // Fermeture de fichier
}
}


return 1;
}
A voir également:

4 réponses

Stupeflip Messages postés 391 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 94
4 mai 2007 à 10:17
Salut,

Essaye en remplaçant
nomListe[i]=malloc(length);
par
nomListe[i]=(char *)malloc(length);
0
Je vois quelques incohérences :

- Tu te fis d'avantage à ta variable globale nb_Adher qu'au fichier ?
: for (i=0; i<nb_adher; i++)
Tu risque d'avoir des plantage en cas de fichier trop court.
Un bon while(!feof(fic)) me semble plus sur, avec un compte complet des adher ( strcpy(nomListe[adher++], nom); )

Je vois aussi un gros problème dans ton parcours pour la suppression :
tu fait nb_Adher-- hors la boucle dans laquelle tu es pour faire le parcours de ton tableau s'arrete à i< nb_adher

Tu ne parcours donc pas tout ton tableau : tu ratte n éléments, n étant égal au nombre d'éléments supprimés ( a moins que ta fonction de suppression " remove(nom_sup); " ne décale tout les éléments.

Je pense que tu doit avoir une variable renseignée au moment de la lecture du fichier pour te donner le nombre max de ton tableau (Nb_Max), parcourir i < nb_Max, faire tes suppressions et mettre NULL là où tu supprime. Enfin pour la réécriture : parcourir i<NB_Max, et si !=NULL ecrire et fair Nb_Adhérent++, pour savoir à la fin combien tu a d'adhérents.

S
0
khalmen22 Messages postés 4 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 24 mai 2008
23 mai 2008 à 13:47
je suis nouveau dans langage C et j'ai un exercice un peu difficile voulez-vous m'aider pliiiiiize
voila l'exrcice:
ecrire un progarmme qui affiche les termes de la suite suivante:
x0=8
Xn+1=(3*Xn+5)%17
1-tester votre progarmme.les 4 premoers termes sont 12.7.9.15.
2-modifier votre progarmme pour qu'il puisse sffiche les N premiers termes de la suite,N est un entier saisit au clavier.
3-déterminer la plus petite et la plus grand valeur de la suite ainsi que leurs indices.
4-détermine la moyenne des N premires de la suite.
et merci j'attend vous réponce et merci.
0
khalmen22 Messages postés 4 Date d'inscription vendredi 23 mai 2008 Statut Membre Dernière intervention 24 mai 2008
24 mai 2008 à 21:32
ou est vous j'attend vous réponce a ce exe.
0