Extraire les données d'un fichier en C
Résolu
M@teo
-
M@teo -
M@teo -
Bonjour à tout le monde,
J'ai commence la programmation il y a peu, et je voulais faire un fonction qui compte le nombre de joueurs d'un fichier, et affiche ensuite leur noms et prénom. Cependant, je tombe sur une boucle infini lors de l'exécution du programme(Au niveau de la boucle while (strcmp(chaine_temp , "Prenom\n")!=0 && chaine_temp!=NULL), bien qu'il n'y ait aucune erreur a la compilation.
Voici ma fonction:
La structure "Personne" est:
Si quelqu'un a une solution à mon probleme, je le remercie d'avance!
J'ai commence la programmation il y a peu, et je voulais faire un fonction qui compte le nombre de joueurs d'un fichier, et affiche ensuite leur noms et prénom. Cependant, je tombe sur une boucle infini lors de l'exécution du programme(Au niveau de la boucle while (strcmp(chaine_temp , "Prenom\n")!=0 && chaine_temp!=NULL), bien qu'il n'y ait aucune erreur a la compilation.
Voici ma fonction:
void Test_profils()
{
Personne j_temp[10];
int i=0;
FILE*fichier_score=NULL;
fichier_score=fopen("Scores.txt", "r+");
char chaine_temp[TAILLE_MAX_CHAINE]="a";
rewind(fichier_score);
while (i<10 && chaine_temp!=NULL)
{
while (strcmp(chaine_temp , "Prenom\n")!=0 && chaine_temp!=NULL)
{
fgets(chaine_temp, TAILLE_MAX_CHAINE, fichier_score);
}
fgets(j_temp[i].prenom, TAILLE_MAX_CHAINE, fichier_score);
while (strcmp(chaine_temp , "Nom\n")!=0&&chaine_temp!=NULL)
{
fgets(chaine_temp, TAILLE_MAX_CHAINE, fichier_score);
}
fgets(j_temp[i].prenom, TAILLE_MAX_CHAINE, fichier_score);
i++;
}
printf("\n=>%d joueur(s)\n", i);
int i2=0;
for(i2=0; i2<i; i++)
{
printf("\nJoueur %d\nPrenom:\n%s\nNom:\n%s\n", i+1, j_temp[i2].prenom, j_temp[i2].nom);
}
fclose(fichier_score);
}
La structure "Personne" est:
typedef struct Personne Personne;
struct Personne
{
char prenom[TAILLE_MAX_CHAINE];
char nom[TAILLE_MAX_CHAINE];
int score1;
int nb_coups1;
int score2;
int nb_coups2;
};
Si quelqu'un a une solution à mon probleme, je le remercie d'avance!
3 réponses
-
Salut,
chaine_temp ne prend pas la valeur NULL à la fin du fichier, c'est fgets qui renvoie une valeur NULL , chaine_temp conservant la derniere valeur lue dans le fichier
tu peux modifier ton code comme ça par ex :
int FF=0;
while (i<10 && !FF)
{
while (!FF && strcmp(chaine_temp , "Prenom\n") )
{
if (!fgets(chaine_temp, TAILLE_MAX_CHAINE, fichier_score) )
FF=1;
}
.................................................. (même chose pour la 2eme boucle)
2eme petit chose, si tu atteint la fin de ton fichier tu incrémentes quand même i
donc ton nombre de joueurs doit être i-1
probleme sur ta boucle for : for(i2=0; i2<i; i++)
tu incrementes i et non i2, le test doit être i2< i-1
for(i2=0; i2<i-1; i2++)-
ou pour faire plus simple :
int FF=0;
while (i<10 && !FF)
{
while (fgets(chaine_temp, TAILLE_MAX_CHAINE, fichier_score) && strcmp(chaine_temp , "Prenom\n") ) ;
if ( !fgets(j_temp[i].prenom, TAILLE_MAX_CHAINE, fichier_score) )
FF=1;
while ( fgets(chaine_temp, TAILLE_MAX_CHAINE, fichier_score) && strcmp(chaine_temp , "Nom\n") ) ;
if (!fgets(j_temp[i].nom, TAILLE_MAX_CHAINE, fichier_score))
FF=1;
i++;
} -
-
-
-
-
FF est initialisé à 0 donc !FF=1 et on passe dans la boucle while.
lorsque la fin de fichier sera rencontré FF passera à 1 et !FF à 0, donc la condition de la boucle sera fausse et on sort de la boucle, si tu ne le mets pas tu incrementes i jusqu'à 10 et ton nombre de joueurs sera faux -