Rechercher : dans
Par :

Fscanf dans la boucle while (langage C)

Dernière réponse le 21 sep 2008 à 19:37:01 oupsman, le 21 sep 2008 à 16:40:19 
 Signaler ce message aux modérateurs

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 ?

Configuration: Linux
Firefox 2.0.0.16

Meilleures réponses pour « fscanf dans la boucle while (langage C) » dans :
Langage C - Les structures conditionnelles Voir Qu'est-ce qu'une structure conditionnelle ? On appelle structure conditionnelle les instructions qui permettent de tester si une condition est vraie ou non. Ces structures conditionnelles peuvent être associées à des structures qui se répètent...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

mype, le 21 sep 2008 à 17:04:31

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);

Répondre à mype

2

oupsman, le 21 sep 2008 à 17:28:21

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

Répondre à oupsman

3

Manu, le 21 sep 2008 à 18:39:32

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

Répondre à Manu

5

oupsman, le 21 sep 2008 à 18:59:42

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.

Répondre à oupsman

4

fiddy, le 21 sep 2008 à 18:54:45

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
Google is your friend

Répondre à fiddy

6

oupsman, le 21 sep 2008 à 19:06:44

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.

Répondre à oupsman

7

fiddy, le 21 sep 2008 à 19:30:46

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.
Google is your friend

Répondre à fiddy

8

oupsman, le 21 sep 2008 à 19:32:57

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 ;-)

Répondre à oupsman

9

 fiddy, le 21 sep 2008 à 19:37:01

Voilà, c'est pour ça que je t'ai demandé de bien faire un copier coller ;)
Google is your friend

Répondre à fiddy