[C] - fonction fscanf() , probleme

- fonction fscanf() , probleme [C] - C++ - Programmation

Marsh Posté le 19-06-2002 à 18:26:44    

voila ce qu'il y a dans mon fichier :  
 
Benoit,A123
Vivi,A451
Zozo,A925
Bulma,B554

 
je souhaite séparer le nom, et le code dans 2 variable differentes.
 
Pour ce faire je procede comme suit :  
 

Code :
  1. while(feof(f_participants)==0)
  2. {
  3.    fscanf(f_participants,"%s,%s",NomLu,CodeLu);
  4.    printf("- %s\n",NomLu);
  5.    }


 
mais ca mar'che pas il me met toute la ligne dans la premiere variable NomLu ! pq?  
 
voici ce que j'obtiens :  
 
- Benoit,A123
- Vivi,A451
- Zozo,A925
- Bulma,B554

 
une idee? Merci d'avance !

Reply

Marsh Posté le 19-06-2002 à 18:26:44   

Reply

Marsh Posté le 19-06-2002 à 18:43:43    

SquiiiD a écrit a écrit :

voila ce qu'il y a dans mon fichier :  
 
Benoit,A123
Vivi,A451
Zozo,A925
Bulma,B554

 
je souhaite séparer le nom, et le code dans 2 variable differentes.
 
Pour ce faire je procede comme suit :  
 

Code :
  1. while(feof(f_participants)==0)
  2. {
  3.    fscanf(f_participants,"%s,%s",NomLu,CodeLu);
  4.    printf("- %s\n",NomLu);
  5.    }


 
mais ca mar'che pas il me met toute la ligne dans la premiere variable NomLu ! pq?  
 
voici ce que j'obtiens :  
 
- Benoit,A123
- Vivi,A451
- Zozo,A925
- Bulma,B554

 
une idee? Merci d'avance !  




Quel est la valeur de retour de tes fscanf ???


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 19-06-2002 à 18:48:17    

Il me renvois 1
 
et si je ne m'abuse fscanf renvois le nombre de champs lu correctements non???  
 
comrpends po :(
 
vla le code complet  
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. void main()
  6. {
  7. struct sParticipants
  8. {
  9.    char nom[20];
  10.    char combinaison[4];
  11.    struct sParticipants *pSuivant;
  12.    } *pPremier, *pCourant;
  13. char NomLu[20];
  14. char CodeLu[4];
  15. FILE *f_participants;
  16. FILE *f_gagnants;
  17. pPremier=(struct sParticipants*)malloc(sizeof(sParticipants));
  18. pCourant=pPremier;
  19. pCourant->pSuivant=NULL;
  20. f_participants=fopen("participants.txt","r" );
  21. f_gagnants=fopen("gagnants.txt","w+" );
  22. while(feof(f_participants)==0)
  23. {
  24.    fscanf(f_participants,"%s,%s",NomLu,CodeLu);
  25.    printf("- %s\n",NomLu);
  26.    }
  27. getch();
  28. }


 
PS: c un exercice pas fini ;)


Message édité par SquiiiD le 19-06-2002 à 18:48:51
Reply

Marsh Posté le 19-06-2002 à 18:52:06    

SquiiiD a écrit a écrit :

Il me renvois 1
 
et si je ne m'abuse fscanf renvois le nombre de champs lu correctements non???  
 
comrpends po :(
 
vla le code complet  
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <malloc.h>
  4. #include <string.h>
  5. void main()
  6. {
  7. struct sParticipants
  8. {
  9.    char nom[20];
  10.    char combinaison[4];
  11.    struct sParticipants *pSuivant;
  12.    } *pPremier, *pCourant;
  13. char NomLu[20];
  14. char CodeLu[4];
  15. FILE *f_participants;
  16. FILE *f_gagnants;
  17. pPremier=(struct sParticipants*)malloc(sizeof(sParticipants));
  18. pCourant=pPremier;
  19. pCourant->pSuivant=NULL;
  20. f_participants=fopen("participants.txt","r" );
  21. f_gagnants=fopen("gagnants.txt","w+" );
  22. while(feof(f_participants)==0)
  23. {
  24.    fscanf(f_participants,"%s,%s",NomLu,CodeLu);
  25.    printf("- %s\n",NomLu);
  26.    }
  27. getch();
  28. }


 
PS: c un exercice pas fini ;)  




 
avec  

Code :
  1. char CodeLu[5];


 
Ca donne quoi ???


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 19-06-2002 à 18:55:00    

La meme chose :'(

Reply

Marsh Posté le 19-06-2002 à 18:56:12    

sinon si y a un autre moyen de separer le nom et le code que fscanf je suis preneur ( sans passer par un algo pour decomposer tout ca )  
merci

Reply

Marsh Posté le 19-06-2002 à 18:57:49    

SquiiiD a écrit a écrit :

La meme chose :'(  




et avec  
 

Code :
  1. char CodeLu[20];


 
???


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 19-06-2002 à 19:11:06    

idem :(

Reply

Marsh Posté le 19-06-2002 à 19:32:28    

SquiiiD a écrit a écrit :

idem :(  




J'ai pas mon compilo C sous la patte malheureusement.
Sinon on va faire en sorte que ça marche, hein ?
1) Déja CodeLu[4] vu que tu veux y stocker 4 caractéres plus les \0 et autres \n, ça ne vas pas suffire.
 
2) fais plutôt fgets puis sscanf :
 

Code :
  1. char buffer[BUFSIZ];
  2. /*...*/
  3. while(feof(f_participants)==0)
  4. {
  5.   fgets(buffer,BUFSIZ,f_participants);
  6.   sscanf(buffer,"%s,%s",NomLu,CodeLu);
  7.   printf("- %s\n",NomLu);
  8.   }


 
3) Dis moi.


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 19-06-2002 à 20:35:57    

Meric mais jai resolu mon prob jai remplacer la virgule par un espace et ca tourne :)
 
merci a toi

Reply

Marsh Posté le 19-06-2002 à 20:35:57   

Reply

Marsh Posté le 19-06-2002 à 20:49:45    

SquiiiD a écrit a écrit :

Meric mais jai resolu mon prob jai remplacer la virgule par un espace et ca tourne :)
 
merci a toi  




 
De rien mais je ne pige pas.
J'ai été soumis à un problème similaire (sauf '.' à la place de ',';) et ça a très bien marché !!!


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 19-06-2002 à 21:07:16    

Avec ton systeme??? je sais pas jai pas tester jai resolut mon prob avant, et la je v un peu arreter , je fais du C depuis midi ! lol j'ai la tete videe.
 
Merci encore et bonne soiree

Reply

Marsh Posté le 19-06-2002 à 21:18:06    

SquiiiD a écrit a écrit :

Merci encore et bonne soiree  




Encore une fois de rien !
A la prochaine  :hello:  
(j'espère que je serais plus efficace !)


---------------
Get the Cooool... Get the cool shoe-shine !
Reply

Marsh Posté le 24-10-2002 à 20:59:58    

A mon avis, tu ne devrais JAMAIS mettre n'importe koi dans le scanf(ou fscanf).
 
en effet, dans la ligne  
[cpp] fscanf(f_participants,"%s,%s",NomLu,CodeLu);[cpp]
tu as mis une virgule dans le fscanf entre les deux "%s" : la tu a demandé a fscanf de virer toutes les virgules pendant la lecture. resultat des courses : toute ta ligne est dans Nomlu.
Voilà le probleme vient de la virgule.
 
je conseille a tous les programmeurs de ne JAMAIS mettre d'espaces ou n'importe quel caractere entre deux "balises" dans un scanf(ou fscanf)
 
C'est le genre de probleme qu'on fait une seule fois dans sa vie, car apres on s'en souvient !


---------------
Learn to live or live to learn ? Studies or not studies ?
Reply

Marsh Posté le 25-10-2002 à 05:08:40    

Variantes de capture de chaîne:

"%10s"    //10 caractères, 11ème '\0' ajouté
"%[abc]"  //uniquement des 'a', 'b' ou 'c'
"%[^abc]" //pas les 'a', 'b' ou 'c'


Attention, feof n'est vrai que quand on a tenté de lire au-delà de la fin du fichier. Trop tard !
 
Testé qui marche:

Code :
  1. while(fscanf(f_participants,"%19[^,],%3s\n",NomLu,CodeLu) != EOF)
  2. printf("- %s\n",NomLu);


scanf est l'inverse de printf: le texte en dehors des formats doit correspondre, et est "sauté" en entrée.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed