Extraire les données d'un fichier en C

Résolu
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:
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!
A voir également:

3 réponses

scribedico Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   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++)
0
scribedico Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   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++;
}
0
M@teo
 
Merci pour ta réponse
il y a un truc que je ne comprend pas: que fait le "!FF"de la première boucle?
0
M@teo
 
Je rencontre un petit problème: le programme affiche un joueur en trop, avec des noms et des prénoms délirants
0
scribedico Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   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);
0
scribedico Messages postés 47 Date d'inscription   Statut Membre Dernière intervention   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
0
M@teo
 
Merci beacoup!
0