Problème de lecture formatée dans un fichier

Problème de lecture formatée dans un fichier - C++ - Programmation

Marsh Posté le 16-02-2003 à 18:51:14    

Bonjour à tous...
J'ai un fihcier composé d'un ligne unique et de cette forme:
E001(X),L004(Y),L004(Z),E002(X),...
 
J'aimerais savoir comment faire pour lire cette ligne en récupérant les blocs spérés par une virgule.
 
J'ai réussi à lire caractère par caractère, mais je en sais pas comment faire pour récupérer E001(X) dans une chaine.
 
Je n'ai pas réussi avec %s, mais la solution doit être là.
 
Merci d'avance

Reply

Marsh Posté le 16-02-2003 à 18:51:14   

Reply

Marsh Posté le 16-02-2003 à 18:56:48    

En gros je voudrais récupérer un bloc dans une chaine en 1 seule instruction fscanf.
et ensuite je boulcerais juska feof

Reply

Marsh Posté le 16-02-2003 à 18:59:43    

Je susi débutant...
s'il vous plait répondez, je susis sur ke vous savez tous faire ça!
 
 
Edit:J'ai finalement réussi à lier la chaîen en entier mais toujours pas bloc par bloc


Message édité par spydurmen le 16-02-2003 à 19:01:28
Reply

Marsh Posté le 16-02-2003 à 19:02:00    

n'utilise jamais feof, regarde le code de retour de feof

Reply

Marsh Posté le 16-02-2003 à 19:04:04    

Mais je suppose ke mon problème ne vien pas du feof.*
 
J'essaye jsute de lire un bloc de taille donnnée de chaine de caractère

Reply

Marsh Posté le 16-02-2003 à 19:07:20    

J'ai réussi c bon, à force de courage
 
Voilà le code au cas où ca intéresse kkun:
 

Code :
  1. FILE * seq;
  2. char* Test;
  3. seq = fopen (argv[1], "r" );
  4. while(!feof(seq)){
  5.         fscanf(seq, "%7s,", &Test);
  6.         printf("%s \n", &Test);
  7. }


Mon erreur de syntaxe était : j'oubliais de mettre & devant Test dans le printf, pensant que Test faisait référence automatiquement à l'adresse(ce ki est tres con de ma part)


Message édité par spydurmen le 16-02-2003 à 19:09:02
Reply

Marsh Posté le 16-02-2003 à 19:12:05    

ben t'a tous faux du debut jusqu'à la fin
 
-Test n'est pas alloué
- feof ne doit aps etre employé comme tu le fais, regarde le code de retour de scanf pour détecter la fin de fichier

Reply

Marsh Posté le 16-02-2003 à 19:14:13    

allez essaye ça
 

Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4.   char bloc[8];
  5.   while(scanf("%7[^,],", bloc) == 1)
  6.     {
  7.       puts(bloc);
  8.     }
  9.   return 0;
  10. }


Message édité par Taz le 16-02-2003 à 19:54:03
Reply

Marsh Posté le 16-02-2003 à 19:15:22    

++Taz a écrit :

ben t'a tous faux du debut jusqu'à la fin
 
-Test n'est pas alloué
- feof ne doit aps etre employé comme tu le fais, regarde le code de retour de scanf pour détecter la fin de fichier


 
 
Comment ça test n'est pas alloué? C'est le scanf qui l'alloue nan?
 
Et puis feof ca marche aps pourquio? parcke ca détecte des \n?
Merci du conseil

Reply

Marsh Posté le 16-02-2003 à 19:16:40    

scanf("%7[^,],", bloc
je comprends pas cette ligne, peux-tu me l'expliquer svp?

Reply

Marsh Posté le 16-02-2003 à 19:16:40   

Reply

Marsh Posté le 16-02-2003 à 19:18:44    

Spydurmen a écrit :


 
 
Comment ça test n'est pas alloué? C'est le scanf qui l'alloue nan?
 
Et puis feof ca marche aps pourquio? parcke ca détecte des \n?
Merci du conseil


scanf alloue quedalle, il écrit la ou tu lui demandes, que ce soit alloué ou pas.

Reply

Marsh Posté le 16-02-2003 à 19:21:08    

- nan fscanf fait pas ça
 
- pour savoir pourquoi feof marche aps, tuf ais une recherche, je l'ai dit 36000 fois
 
-

Citation :

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 :
 
  while(fscanf(f_participants,"%19[^,],%3s\n",NomLu,CodeLu) != EOF)
   printf("- %s\n",NomLu);
 
scanf est l'inverse de printf: le texte en dehors des formats doit correspondre, et est "sauté" en entrée.

 
 
fscanf renvoie le nombre d'éléments correctement convertit, 0 si rien n'a pu etre converti, ou EOF en cas de de fin de ficheir ou de problème. donc il faut tester soit EOF soit != nombre_truc_a_lire

Reply

Marsh Posté le 16-02-2003 à 19:26:46    

Ptin je savais meme pa ke puts marhcahit en C
je croyais ke ct ke le C++

Reply

Marsh Posté le 16-02-2003 à 19:27:25    

Spydurmen a écrit :

Ptin je savais meme pa ke puts marhcahit en C
je croyais ke ct ke le C++

puts c'est pas du C++. ni les char*

Reply

Marsh Posté le 16-02-2003 à 19:30:36    

En gros mon erreur ct de croire ke en faisant char* je déclarait un tableau de char de la même facon ke si j'avais fait char [8]  c ca?

Reply

Marsh Posté le 16-02-2003 à 19:34:23    

toi t'as besoin de prendre un cours de pointeurs

Reply

Marsh Posté le 16-02-2003 à 19:45:44    

nan en fait g compri pour les pojnteurs t'inkietes
en revnahce comment faire pour ne pas détecter les blancs c koi?

Reply

Marsh Posté le 16-02-2003 à 19:47:59    

non je crois que t'as pas compris les pointeurs sinon tu ferais la différence entre un tableau et pointeur.
 
c'est quoi ton problème avec les blancs?


Message édité par Taz le 16-02-2003 à 19:58:52
Reply

Marsh Posté le 16-02-2003 à 19:59:40    

char* c un pointeur sur caractère, on peut l'utiliser pour gérer une chaine de caractère en considérant ke ca pointe sur le premierr caractère d chaine
c pas alloué dans la mémoire
char [8] ca réserve de la place pour un tableau de caractère
(je c ce ke c un pinteur ;))
 
Sinon j'aimerais pouvoir sauter la lecture si ya un blance

Reply

Marsh Posté le 16-02-2003 à 20:05:15    

un char * pointe vers une zone mémoire correctement allouée!
 
ben la ou tu veux sauter des blancs, je vois pas trop comment le faire avec scanf, à moins que tu aies systématiquement au moins un blanc... alros je cherche
 
en tout cas tu peux faire un

Code :
  1. int c;
  2. while((c=fgetc(fichier))!=EOF && isspace(c));
  3. if(c == EOF)
  4. {
  5.   // fin de fichier ou erreur
  6.   // fin de programme?
  7. }
  8. else
  9. {
  10.   // on remet le dernier caractere dans le flux
  11.   // sinon on perd la première lettre
  12.   ungetc(c, fichier);
  13. }

tout ça à mettre dans une fonction


Message édité par Taz le 16-02-2003 à 20:16:06
Reply

Sujets relatifs:

Leave a Replay

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