Problème d'affichage

salma88 -  
kilian Messages postés 8854 Statut Modérateur -
Bonjour,
j'ai fait un programme qui permet d'ajouter des informations des stagiaires dans un fichiers , mais si j'ajoute 2 stagiaires et je choisis de les afficher le programme ne m'affiche que les données du premier stagiaire tandis qu'il affecte des valeurs nulles aux informations du 2ème stagiaire !!!! aidez moi slv c'est très urgent !!!

voici le code :::

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

FILE *f;
char fiche[30]="c://stagiaire.txt";

void saisie(void);
void affichage(void);
void enregisTab(void);
void LirTab(void);
void menu(void);

/******************************************/
struct stagiaire
{
char nom[10],prenom[10];
int matricule;
float moyenne;
}T[100]	;
int i=0,n=0;
/******************************************/
void menu(){
printf("____________________Menu_____________________\n");
printf("|1:Saisir les informations d'un stagiaire                           |\n")
printf("|2:Afficher les informations d'un stagiaire                       |\n");
printf("|3:Quitter                                                                 |\n");
/*********************************************/
void main(){int choix;
do{
menu();
printf("Saisir votre choix ...\n");
scanf("%d",&choix);
switch(choix){
case 1:saisie();break;
case 2:affichage();break;
}
}while(choix!=3);
}
/*******************************************/
void saisie(){   int rep;
do{
n++;
printf("saisir le nom du stagiaire\n");
scanf("%s",T[i].nom);
printf("saisir le prenom du stagiaire\n");
scanf("%s",T[i].prenom);
printf("saisir le matricule du stagiaire\n");
scanf("%d",&T[i].matricule);
printf("saisir la moyenne du stagiaire\n");
scanf("%f",&T[i].moyenne);
i++;
printf("voulez vous ajouter un autre stagiaire ?(0/1)\n");
scanf("%d",&rep);
}while(rep!=0);
enregisTab();
}
/*******************************************/
/*void ajout()
{
 f=fopen(fiche,"a");
 fwrite(&T,sizeof(T),1,f);
 fclose(f);
} */
/*******************************************/
void enregisTab()
{
f=fopen(fiche,"w");
fwrite(&T,sizeof(T),n,f);
fclose(f);
}
/*******************************************/
void LirTab(){
int fin,i=0;
f=fopen(fiche,"r");
do{
fin=fread(&T[i],sizeof(T),1,f);
i++;
}while(fin!=0);
fclose(f);
}
/*******************************************/
void affichage()
{
LirTab();
for(i=0;i<n;i++)
{
printf("******************************************\n");
printf(" les informations du stagiaire sont : \n");
printf(" Son nom est  :%s\n",T[i].nom);
printf(" Son prenom est  :%s\n",T[i].prenom);
printf(" Son matricule est  :%d\n",T[i].matricule);
printf(" Sa moyenne est  :%f\n",T[i].moyenne);
printf("******************************************\n");

}
enregisTab();
}

3 réponses

kilian Messages postés 8854 Statut Modérateur 1 526
 
Salut,

A la fin de ta saisie, tu appelles void enregisTab() dans lequel tu fais:
f=fopen(fiche,"w");
fwrite(&T,sizeof(T),n,f);
fclose(f);


L'ouverture avec "w" efface complètement le fichier, puis tu écris la nouvelle entrée.
Tu devrais ouvrir ton fichier avec l'attribut a.
0
salma88
 
bonjour ,
j'ai modifié le code en prenant en considération votre remarque mais même si, le problème n'était pas résolu
le nouveau code est le suivant :



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

FILE *f;
char fiche[30]="c://stagiaire.txt";

void saisie(void);
void affichage(void);
void enregisTab(void);
void LirTab(void);
void menu(void);

/******************************************/
struct stagiaire
{
char nom[10],prenom[10];
int matricule;
float moyenne;
}T[100]	;
int i=0,n=0;
/******************************************/
void menu(){
printf("____________________Menu_____________________\n");
printf("|1:Saisir les informations d'un stagiaire                           |\n")
printf("|2:Afficher les informations d'un stagiaire                       |\n");
printf("|3:Quitter                                                                 |\n");
/*********************************************/
void main(){int choix;
do{
menu();
printf("Saisir votre choix ...\n");
scanf("%d",&choix);
switch(choix){
case 1:saisie();break;
case 2:affichage();break;
}
}while(choix!=3);
}
/*******************************************/
void saisie(){   int rep;
do{
n++;
printf("saisir le nom du stagiaire\n");
scanf("%s",T[i].nom);
printf("saisir le prenom du stagiaire\n");
scanf("%s",T[i].prenom);
printf("saisir le matricule du stagiaire\n");
scanf("%d",&T[i].matricule);
printf("saisir la moyenne du stagiaire\n");
scanf("%f",&T[i].moyenne);
i++;
printf("voulez vous ajouter un autre stagiaire ?(0/1)\n");
scanf("%d",&rep);
}while(rep!=0);
ajout();
}
/*******************************************/
void ajout()
{
 f=fopen(fiche,"a");
 fwrite(&T,sizeof(T),n,f);
 fclose(f);
} 
/*******************************************/
/*void ajout()
{
 f=fopen(fiche,"a");
 fwrite(&T,sizeof(T),1,f);
 fclose(f);
} */
/*******************************************/
void enregisTab()
{
f=fopen(fiche,"w");
fwrite(&T,sizeof(T),n,f);
fclose(f);
}
/*******************************************/
void LirTab(){
int fin,i=0;
f=fopen(fiche,"r");
do{
fin=fread(&T[i],sizeof(T),1,f);
i++;
}while(fin!=0);
fclose(f);
}
/*******************************************/
void affichage()
{
LirTab();
for(i=0;i<n;i++)
{
printf("******************************************\n");
printf(" les informations du stagiaire sont : \n");
printf(" Son nom est  :%s\n",T[i].nom);
printf(" Son prenom est  :%s\n",T[i].prenom);
printf(" Son matricule est  :%d\n",T[i].matricule);
printf(" Sa moyenne est  :%f\n",T[i].moyenne);
printf("******************************************\n");

}
enregisTab();
}
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Non en fait tu as raison, vu que tu enregistres tout d'un coup, autant utiliser w.

Par contre, si tu es sous windows, il faut que tu ajoutes l'option b dans fopen.
C'est à dire au lieu de fopen("machin", "r"), il faut mettre fopen("machin", "rb")

Fait pareil pour w à remplacer par wb.
0
salma88
 
mais ça n'a pas résolu le problème !!
0
kilian Messages postés 8854 Statut Modérateur 1 526
 
Bon j'ai essayé de le compiler chez moi. Je ne sais même pas comment comment tu as fait pourle compiler vu le nombre d'erreur qu'il y a dedans.

D'abord tu as oublié de fermer l'accolade dans le menu.
Ensuite tes erreurs se situent dans les fread.

Dans enregisTab tu fais fwrite(&T,sizeof(T),n,f);
Je ne vois pas pourquoi tu mets n.
C'est fwrite(&T,sizeof(T),1,f); car tu veux écrire T qui a la taille de 100 tableaux de structure stagiaire.

Ensuite dans LirTab tu as
fin=fread(&T[i],sizeof(T),1,f);
En fait tu lis un membre de T en demandant de lire la taille de T, soit 100 fois ce que tu demandes.
Il faudrais que tu mettes
fread(&T[i],sizeof(struct stagiaire),1,f);

Voilà...chez moi ça marche bien en tout cas (et n'oublie pas les b si tu es sous windows).
0