Modification d'un champs en langage C

Fermé
COUSSI Matthieu - 1 avril 2005 à 16:29
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 7 avril 2005 à 21:02
typedef struct
{
int num_joueur;
char nom_joueur[20];
char prenom_joueur[20];
char sexe[2];
char adresse_joueur[60];
char cp_joueur[6];
char ville_joueur[20];
char tel_joueur[15];
char brule[2];
char type_licence[2];
int naissance_joueur;
char numlicence_joueur[30];
char paye_joueur[2];
char surclassement[2];
int num_equipe;
}joueurs;

joueurs joueur



case 3:
{/*Debut de case bis 3 Modifier joueurs*/
printf("Quel est le nom du joueur que vous voulez modifier :");
scanf("%s",nom_modif);
printf("Quel modification voulez-vous faire :\n");
printf("1 -Nom joueur\n");
printf("2 -Prenom joueur\n");
printf("3 -Joueur déménager\n");
printf("4 -Téléphone joueur\n");
printf("5 -Numeros de licence joueur\n");
printf("6 -Type de licence\n");
printf("7 -Payer sa licence\n");
printf("8 -Surclassement\n");
do
{
printf("Que voulez vous faire :");
scanf("%d",&modif);
if((modif<1) | (modif>8))
erreur_message(0);
}
while((modif<1) | (modif>8));

switch (modif)
{/*Debut de switch MODIFICATION joueur*/
case 1 :
{/*Debut de case bis 1 Modification Nom Joueur */
modif_nomjoueur();
break;
}/*Fin de case bis 1 Modification Nom Joueur */




/*Fonction*/
/*Fonction MODIFICATION du Nom*/
void modif_nomjoueur()
{
int position=0;
int trouve=0;
p_joueur=fopen("c:\\temp\\joueur.txt","r+");
if(!p_joueur)
{
printf("ERREUR\n");
exit(-1);
}
while((!feof(p_joueur)) && (trouve!=1))
{
fread(&joueur,sizeof(joueurs),1,p_joueur);


if((strcmp(nom_modif,joueur.nom_joueur)==0) && (trouve!=1))
{
printf(" joueur trouve %s %s \n", joueur.nom_joueur, joueur.prenom_joueur);
position=ftell(p_joueur);
printf("\n \n la position est % i\n", position);
fseek(p_joueur,sizeof(joueurs)*(position),SEEK_SET);
fread(&joueur,sizeof(joueurs),1,p_joueur);
printf(" joueur trouve %s %s \n", joueur.nom_joueur, joueur.prenom_joueur);
printf("Quel est le nouveau nom :");
scanf("%s",joueur.nom_joueur);
printf(" aprés modif le joueur est %s %s ", joueur.nom_joueur, joueur.prenom_joueur);
fwrite(&joueur,sizeof(joueurs),1,p_joueur);
trouve=1;
}

}
printf("\n\n");
fclose(p_joueur);


}




VOILA MON CODE UN PEU RETRECIE. EN FAIT JE NE MODIFIE PAS MON CHAMPS MAIS CELA MEN COPIE UN AUTRE MODIFIE AVEC EN PLUS TENEZ VOUS BIEN TOUT MON CODE DE PROGRAMME. SVP AIDEZ MOI MERCI A TOUS.
A voir également:

3 réponses

blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
1 avril 2005 à 19:49
salut

ce genre de plantage ressemble à un dépassement de capacité.
("segmentation fault" sous unix(linux), et sous windows ça fait ce genre de choses bizzarres)
au lieu de
joueurs joueur 

tu devrais essayer les pointeurs
struct joueur  *joueurs=(struct joueur *)  malloc(nombre_de_joueurs * sizeof(*joueur));

et en fin de fonction,
free(joueurs);

à partir de là, les "." sont à remplacer par des "->"
exemple:
joueurs->nom_joueur

ou bien :
joueurs[N° du joueur].nom_joueur

realloc peut aussi être très utile si tu ne connais pas à l'avance le nombre de joueurs lors du chargement du fichier (fread)
bienvenue dans la manipulation de pointeurs !
c'est là tout l'intérêt du C
cordialement
0
COUSSI Matthieu
3 avril 2005 à 14:56
J'ai pa tt a fait compris ce que tu ma expliquer vu que je suis debutant dans ce domaine merci d'avance pour ton aide...
0
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
7 avril 2005 à 21:02
Je suis en total accord avec ce qu'a dit Blurk, mais tu devrais te fournir en doc sur le C, comme acheter la bible (je l'ai et j'en suis tres content), ou alors si tu veux je peux t'envoyer des tuto ou des cours (mais pas avnat la semaine prochaine...)

++
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
3 avril 2005 à 21:06
ton système ne permet de gérer qu'une seule fiche.
même si le compilateur n'affiche aucune erreur, l'utilisation
de la mémoire avec ce programme risque de planter.
pour gérer plusieurs fiches en mémoire, il faut manipuler les pointeurs.
en C, connaitre les pointeurs c'est INDISPENSABLE.
Il y a pas mal de bonnes docs sur le language C sur ce site,
je te conseille de les lire.

cordialement
0
COUSSI Matthieu
7 avril 2005 à 17:03
Il y a un truc que je n'ai pas totalement compris dans ton explication. c'est qu'il faille que j'utilise des pointeurs, le probleme c'est que j'en utilise; sinon j'ai compris ton raisonnement le fait qu'il n'y ait pas assez d'espace mémoire , mais c'est la manip que je n'ai pas capter. Ce n''est pa grave car j'ai contourné la difficulté en incrémentent une variable i a chaque lecture d'enregistrement et dés que la comparaison du strcmp et juste je fai un fseek de i-1. coordialement un novice....Merci de ton Aide
0
blurk Messages postés 486 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 15 mars 2009 160
7 avril 2005 à 17:29
tant qu'il n'y a qu'un seul joueur en mémoire pas de problème
tu utilise effectivement des mointeurs statiques
exemple:
char nom_joueur[20];

la taille d'une structure joueur est connue et tout va bien
avec ce type de pointeurs , mais seulement dans la structure.

si tu dois manipuler 20 joueurs en mémoire
tu peux faire :

struct joueurs joueur [20];


mais si tu ne connais pas le nombre de joueurs avant d'avoir chargé le fichier, pas d'autre solution que l'allocation dynamique :

joueurs *joueur= (struct joueurs *)malloc((nombre_joueurs+1) *sizeof( joueurs *));


et en fin de fonction
free(joueur);


tu peux réalouer au fur et à mesure que le nombre de joueurs augmente.

cela permet de tout charger, tout manipuler en mémoire, et tout sauvegarder d'un seul bloc sans avoir à jongler avec des fseek.

cordialement
0