Probleme d'affichage des donnes d 'un fichier ou pb d'enregistrement des donnees

cs_Yossi Messages postés 40 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 5 septembre 2006 - 17 juin 2004 à 18:09
cs_Yossi Messages postés 40 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 5 septembre 2006 - 18 juin 2004 à 10:31
bonjour,
voici ma structure:
struct adherents{
int numadherent;
char nom[25];
char prenom[30];
char adresse[80];
char cp[5];
char ville[40];
};

voici mon code pour l'enregistrement d 'un adherent:

struct adherents s;
FILE *pf=NULL;
pf=fopen("adherents","rb");
s.numadherent=0;
if (pf==NULL)
{
pf=fopen("adherents","w+b");
}
else
{
fclose(pf);
pf=fopen("adherents","a+b");
fread(&s,sizeof(s),1,pf);
while(fread(&s,sizeof(s),1,pf),!feof(pf)){}

}
s.numadherent++;
printf("\nNumero de l'adherent : %d\n",s.numadherent);

printf("\nNom:\n");
gets(s.nom);
fflush(stdin);
printf("\nPrenom:\n");
gets(s.prenom);
fflush(stdin);
printf("\nAdresse:\n");
gets(s.adresse);
fflush(stdin);
printf("\nCode postal:\n");
gets(s.cp);
fflush(stdin);
printf("\nVille:\n");
gets(s.ville);
fflush(stdin);

fwrite(&s,sizeof(s),1,pf);
fclose(pf);
printf("\nAdherent enregistre\n");
system("pause");

et voici mon code pour l'affichage des donnees:
printf("\nEntrez le numero d'adherent\n");

int num=0;
scanf("%d",&num);
struct adherents s;
FILE *pf=NULL;
pf=fopen("adherents","rb");

if (pf!=NULL)
{
while (fread(&s,sizeof(s),1,pf),!feof(pf)&& num!=s.numadherent)
{

}

if (feof(pf))
{
printf("Adherent non trouve\n");
}
else
{
printf("Informations sur l'adherent numero %d\n\n",s.numadherent);
printf("\nNom : %s",s.nom);
printf("\nPrenom : %s",s.prenom);
printf("\nAdresse : %s",s.adresse);
printf("\ncode postal : %s",s.cp);
printf("\nVille : %s\n",s.ville);
}
fclose(pf);
}
else
{
printf("Aucun adherent n'est enregistre\n");
}
system("pause");

voila . mon probleme c'est que au lieu de donner comme code postal par exemple : "75011" ca donne "75011paris" (le code postal et la ville). si vous savez d'ou vient le probleme ca m'aiderait beaucoup. Merci d'avance.

Yossi

3 réponses

ShareVB Messages postés 2676 Date d'inscription vendredi 28 juin 2002 Statut Membre Dernière intervention 13 janvier 2016 25
17 juin 2004 à 19:49
salut

en fait, un tableau char est traité comme un pointeur par printf, et comme cp fait 5 caracteres max et 75011 5 aussi, il n'y a donc pas de null à la fin des char. Les données de ville suivent celle de cp. Donc en mémoire à l'adresse de cp on a : "75011paris/0" ...ceci explique cet affichage... si on fait un strlen il renverra 10...

printf affiche une chaine du début au premier null...

il faut donc que tu mettes :
printf("\ncode postal : %.5s",s.cp);
//5 caracteres maxi

voilà

ShareVB
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
17 juin 2004 à 22:50
le mieux c'est de prévoir la place pour le nul de terminaison dans les chaînes de la structure, car si tu copie une chaîne dans le champ cp, le nul risque d'écraser le champs suivant.
0
cs_Yossi Messages postés 40 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 5 septembre 2006
18 juin 2004 à 10:31
Merci beaucoup à vous deux!!
Yossi
0