Extraire les données d'un fichier en C

[Résolu/Fermé]
Signaler
-
 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:
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

Messages postés
47
Date d'inscription
vendredi 13 avril 2012
Statut
Membre
Dernière intervention
6 mai 2013
2
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++)
Messages postés
47
Date d'inscription
vendredi 13 avril 2012
Statut
Membre
Dernière intervention
6 mai 2013
2
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++;
}
Merci pour ta réponse
il y a un truc que je ne comprend pas: que fait le "!FF"de la première boucle?
Je rencontre un petit problème: le programme affiche un joueur en trop, avec des noms et des prénoms délirants
Messages postés
47
Date d'inscription
vendredi 13 avril 2012
Statut
Membre
Dernière intervention
6 mai 2013
2
regarde le premier post ta condition de sortie du for doit être i-1

for(i2=0; i2<i-1; i2++)

et ton nombre de joueurs i-1

printf("\n=>%d joueur(s)\n", i-1);
Messages postés
47
Date d'inscription
vendredi 13 avril 2012
Statut
Membre
Dernière intervention
6 mai 2013
2
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
Merci beacoup!