Fscanf dans la boucle while (langage C)

Résolu/Fermé
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 - 21 sept. 2008 à 16:40
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 21 sept. 2008 à 19:37
Bonjour,
le contenu de mon fichier texte est :

Mitterand François H 08/23/47
Bush Georges H 07/28/56
Filon Cristine F 06/21/69
....etc

en gros c'est le nom, le prenom, le sexe et la date de naissance.
une ligne correspond à une personne.

mon algo est une boucle while qui dit que : tant que je ne suis pas en fin de fichier, je recupere le contenu de chaque ligne dans des variables correspondantes et je l'affiche.

voici le code :

<gras>{ ....
/*on suppose que les varibles nom, prenom ... sont déjà déclarées*/

while(fscanf(le_nom_du_fichier, " %s %s %c %s", nom, prenom, &sexe, datenaissance) != EOF)
{
printf("\nRESULTAT %d %s %s %s %c %s\n", nom, prenom, sexe, datenaissance);
}

...
}


Le problème c'est que ça m'affiche uniquement la dernière ligne. Dans l'exemple du fichier au-dessus, s'il y a ces 3 personnes dans le fichier, il ne m'affiche que Filon Cristine F 06/21/69

alors que moi je veux afficher :

Mitterand François H 08/23/47
Bush Georges H 07/28/56
Filon Cristine F 06/21/69


Qu'est-ce qui va pas dans mon programme SVP ?

5 réponses

Bonjour,

while(fscanf(le_nom_du_fichier, " %s %s %c %s", nom, prenom, &sexe, datenaissance) != EOF)

la fonction fscanf() ne renvoie jamais EOF, elle renvoie le nombre d'items lus, dans votre cas le résultat normal est 4, donc vous devez tester == 4

Vous n'avez sans doute pas copié votre ligne réelle. Je ne serais pas étonné qu'elle se termine par un point-virgule.

Manu
3
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
21 sept. 2008 à 18:59
salut Manu,

la fonction fscanf teste bien un EOF, j'ai vu ça dans un tuto.
preuve : j'ai le fichier nombres.txt
son contenu est

1
2
3
4
5
6
7


voici mon code :

int main(){
FILE * fic;
int nombre;
fic = fopen("nombres.txt", "r");
if(fic == NULL){
printf("Impossible d'ouvrir le fichier %s\n", "nombres.txt");
exit(1);
}

while(fscanf(fic, "%d", &nombre) != EOF){
printf("\nRESULTAT : %d\n", nombre);
}



if(fclose(fic) == EOF){
printf("\nProbleme de fermeture du fichier %s\n", "nombres.txt");
exit(1);
}


return 0;
}

Et comme résultat il m'affiche bien :

RESULTAT : 1
RESULTAT : 2
RESULTAT : 3
RESULTAT : 4
RESULTAT : 5
RESULTAT : 6
RESULTAT : 7

Conclusion : le teste d'EOF fonction réellement.
-1
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
21 sept. 2008 à 19:32
En fait c'est un truc tout bête !!!!

dans ma fonction c'était

{
...
while( ...);
{

}
}

Il y avait le point virgule qui s'est glissée juste après la fermeture de la parenthèse de while !!!

En tout cas merci à tous ceux qui m'ont répondu, bonne soirée à tous ;-)
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 834
21 sept. 2008 à 19:37
Voilà, c'est pour ça que je t'ai demandé de bien faire un copier coller ;)
1
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
21 sept. 2008 à 17:04
ben deja ton printf il est bizarre...

tu as 4 variables et 6 formats...
ça serait plutot
printf("\nRESULTAT  %s %s %c %s\n", nom, prenom, sexe, datenaissance);
0
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
21 sept. 2008 à 17:28
oui merci, enfin, le problème n'est pas vraiment ça, je n'arrive pas à parcourir ligne par ligne

il ne m'affiche que la dernière ligne
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 834
21 sept. 2008 à 18:54
Salut,
Essaie ce code :
#include <stdio.h>

int main(void){
    char nom[15],prenom[15],sexe,date[10];

    FILE *fp=fopen("president.txt","r");
    while(fscanf(fp,"%s %s %c %s",nom,prenom,&sexe,date)!=EOF){
        printf("nom: %s\n",nom);
        printf("prenom: %s\n",prenom);
        printf("sexe: %c\n",sexe);
        printf("date: %s\n",date);
    }
    return 0;
}


Cdt
0
oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008 10
21 sept. 2008 à 19:06
Salut fiddy,

J'ai essayé ton conseil, ça me donne le même résultat, càd il prend en compte la dernière ligne avant l'EOF. La ligne 1 et 2 ne sont pas affichées.
-1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 834 > oupsman Messages postés 316 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 22 octobre 2008
21 sept. 2008 à 19:30
T'as bien fait un copier coller de mon code ?
Car si c'est pas exactement le même, ceci peut expliquer cela.
En tout cas sur mon ordi, le code que je t'ai donné marche bien. Toutes les lignes sont prises en compte.
-1