Extraire les données d'un fichier en C

Résolu/Fermé
M@teo - Modifié par M@teo le 22/04/2012 à 15:13
 M@teo - 22 avril 2012 à 20:27
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

scribedico Messages postés 47 Date d'inscription vendredi 13 avril 2012 Statut Membre Dernière intervention 6 mai 2013 2
Modifié par scribedico le 22/04/2012 à 16:22
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 vendredi 13 avril 2012 Statut Membre Dernière intervention 6 mai 2013 2
22 avril 2012 à 16:50
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
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
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 vendredi 13 avril 2012 Statut Membre Dernière intervention 6 mai 2013 2
Modifié par scribedico le 22/04/2012 à 19:00
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 vendredi 13 avril 2012 Statut Membre Dernière intervention 6 mai 2013 2
22 avril 2012 à 18:53
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
Merci beacoup!
0