Modification d'un champs en langage C
COUSSI Matthieu
-
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
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.
{
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:
- Modification d'un champs en langage C
- Langage ascii - Guide
- Suivi de modification word - Guide
- Logiciel gratuit modification pdf - Guide
- Modification dns - Guide
- Langage binaire - Guide
3 réponses
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
tu devrais essayer les pointeurs
et en fin de fonction,
à partir de là, les "." sont à remplacer par des "->"
exemple:
ou bien :
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
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
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
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
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
tant qu'il n'y a qu'un seul joueur en mémoire pas de problème
tu utilise effectivement des mointeurs statiques
exemple:
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 :
mais si tu ne connais pas le nombre de joueurs avant d'avoir chargé le fichier, pas d'autre solution que l'allocation dynamique :
et en fin de fonction
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
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
++