|
|
|
|
Salut , j' ai un souci avec un fichier en C. Mon pg permet les gestion des absences, des retard et des retenues par trimestre. Voila j'ai la structure suivante :
struct eleve
{
int identifiant;
char nom[LG];
char prenom[LG];
char classe[LG];
char numtel[LG];
int retard;
int absence;
int retenue;
int retard_trim1;
int absence_trim1;
int retenue_trim1;
}seleve ;
void reinit_eleve()
{
char rep;
int compteur;
printf("Vous allez reinitialiser \n\nles -retenues\nles -absences\nles -retards\n\ndu trimestre en cours\n");
printf("Voulez vous continuez ?\n");
scanf("%c",&rep);
flushall();
fichier_eleve=fopen("fichier1_eleve","wb");//on ouvre le fichier
if((rep=='o')|| (rep=='O'))
{
while (fread (&seleve, sizeof(seleve),1,fichier_eleve) != 0)//tant qu'on lit dans le fichier
{
fseek(fichier_eleve,sizeof(seleve)*(seleve.absence),SEEK_SET);
seleve.absence_trim1=seleve.absence;
compteur=compteur+1;
}
}//fin if
else
{
printf("Il n'y a pas d'eleve dans la base...\n\n");
}
fseek(fichier_eleve,sizeof(seleve)*(seleve.absence),SEEK_SET); //SEEK SET faire bouger le curseur du pointeur
//on se replace a l'endroit du fichier où se trouve l' eleve
fwrite(&seleve,sizeof(seleve),1,fichier_eleve);
//on écrit le client dans le fichier, par dessus
fclose(fichier_eleve);//fermeture du fichier
getch();
}
Plusieurs choses :
|
Salut!
|
Merci pour votre aide mais tout ne se passe pas comme je le veux.
fichier_eleve=fopen("fichier1_eleve","r+");//on ouvre le fichier
if((rep=='o')|| (rep=='O'))
{
while (fread (&seleve, sizeof(seleve),1,fichier_eleve) != 0)//tant qu'on lit dans le fichier
{
//fseek(fichier_eleve,sizeof(seleve),SEEK_SET);
seleve.retard=0;
seleve.absence=0;
seleve.retenue=0;
//seleve.absence_trim1=seleve.absence;
}
fseek(fichier_eleve,sizeof(seleve),SEEK_SET); //SEEK SET faire bouger le curseur du pointeur
//on se replace a l'endroit du fichier où se trouve l' eleve
//fwrite(&seleve,sizeof(seleve),1,fichier_eleve);
//on écrit le client dans le fichier, par dessus
fclose(fichier_eleve);//fermeture du fichier
}
alors quand je l'execute il ne se passe rien. Il retourne au menu sans rien modifier. J'ai testé avec 2 eleves dans le fichier. Le probleme doit venir du fseek, je ne sais pas comment bien l'utiliser et quelles elements mettre a l'interieur. J'aimerai des explications car j'ai pas pigé cela : Revenir en arrière dans le fichier avec fseek. La solution la plus propre est de faire un déplacement -1*sizeof(seleves), afin de se recaler juste sur la structure (en utilisant SEEK_CUR) (Eventuellement, faire un déplacement de N°élève*sizeof(seleves) MAIS IL FAUT ETRE SÛR QUE LES ELEVES SONT DANS L'ORDRE ET QU'IL N'Y A PAS DE TROU, hypothèse non réaliste (sinon ton N° d'étudiant changerais au moins tout les ans)). Quand tu dis qu'il ny a pas de trous, cela veut dire que tout les eleves sont enregistrés les uns a la suite; Si c'est le cas, oui. Comment resoudre mon probleme ?? Merci (¯`·.¸¸.-> £udo <-.¸¸.·´¯) |
Salut,
fichier_eleve=fopen("fichier1_eleve","r+b");//on ouvre le fichier
if((rep=='o')|| (rep=='O'))
{
while (fread (&seleve, sizeof(seleve),1,fichier_eleve) != 0)//tant qu'on lit dans le fichier
{
seleve.retard_trim1=seleve.retard;
seleve.retard=0;
seleve.absence_trim1=seleve.absence;
seleve.absence=0;
seleve.retenue_trim1=seleve.retenue;
seleve.retenue=0;
fseek(fichier_eleve, sizeof(seleve) * -1,SEEK_CUR);
fwrite(&seleve,sizeof(seleve),1,fichier_eleve);
}
}//fin if
else
A++ La liberté ne se donne pas, elle se prend... |
J' ai essyé avec ta propostion avec 3 eleves dans le fichier, les champs revienent a 0 mais ensuite quand je le consulte, je me retrouve avec 3000 eleves. Et aussi apres avoir mis oui au choix, il ne reviens pas au menu.
|
DestyNov@ >> Hey, l'autre, hé !!!
|