[C, C++] Bidouille avec sscanf

Bidouille avec sscanf [C, C++] - C++ - Programmation

Marsh Posté le 26-06-2002 à 11:14:24    

encore moi :D
 
Mais bon la je trouve pas :/
 
Voila je recupere des lignes dans un fichier, je connais la struct du fichier.
Donc je fais un fegts et ensuite un sscanf sur la chaine recuperee.
 
Apres je veux trier les champs, separes par des ;.
Pour les int, etc... c'est ok %d;%d ca fonctionne.
Pour les chaines y a un pb :/
Forcement les %s s'arretent au space, donc marche pas.
Avec %[^;] ca marche, sauf que quand j'ai un champ vide, (ex blabla;;blabla), ben il s'arrete :/
 
Des idees ? :)


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 11:14:24   

Reply

Marsh Posté le 26-06-2002 à 11:16:49    

c quoi exactement la structure de ton fichier?


---------------
Le Tyran
Reply

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

En fait c'est que des champs separes par des ;
Au debut de chaque ligne tu as un code, ensuite selon le code je connais la structure de la ligne.
Ca te suffit comme reponse ?


---------------
Super.
Reply

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

perso j'utiliserais strtok et atoi plutôt que sscanf


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-06-2002 à 11:25:20    

antp a écrit a écrit :

perso j'utiliserais strtok et atoi plutôt que sscanf




 
Ouai pareil.

Code :
  1. FILE *file;
  2. char buffer[512];
  3. char * start;
  4. file = fopen("monfichier","r" );
  5. fgets(buffer,512,file);
  6. start = strtok(buffer,";" );
  7. //...


 


---------------
Le Tyran
Reply

Marsh Posté le 26-06-2002 à 11:45:27    

antp a écrit a écrit :

perso j'utiliserais strtok et atoi plutôt que sscanf




en C strtok pour separer les champs...
sinon en C++, en mettant ta chaine dans une string, tu pourras recuperer des sous-chaines...

Reply

Marsh Posté le 26-06-2002 à 11:52:22    

Ben le pb avec strtok c'est qu'il me separe les chaines mais j'ai pas les index :/
 
Style blabla;;blabla2
 
Ben il chope blabla, token suivant blabla, il capte pas le vide, donc ca me va pas.


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 11:56:22    

c'est bizarre, ça doit marcher avec les chaines vides pourtant


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 26-06-2002 à 11:58:39    

Ouai mais c moin pratique que strtok je trouve (peut être une question d'habitude)


---------------
Le Tyran
Reply

Marsh Posté le 26-06-2002 à 12:00:43    

Ben je crois pas faire d'erreurs :??:
 
C'est dommage je sentais que j'etais pas loin avec l'histoire du [^;] :/


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 12:00:43   

Reply

Marsh Posté le 26-06-2002 à 12:00:45    

antp a écrit a écrit :

c'est bizarre, ça doit marcher avec les chaines vides pourtant




 
Non,si tu regarde bien l'algo de strtok tu voit que la fonction saute les champ vide.
Faut que tu fasse un strchr et que tu regarde si la différence d'adresse est > à 1. Si non tu met un espace dans les champ vides et c bon :)


---------------
Le Tyran
Reply

Marsh Posté le 26-06-2002 à 12:01:49    

Code :
  1. int main(int argc, char* argv[])
  2. {
  3. char buf[] = "Salut les amis;;Cool";
  4. char chaine1[30] = {0};
  5. char chaine2[30] = {0};
  6. char chaine3[30] = {0};
  7. char *token = strtok(buf, ";" );
  8. strcpy(chaine1, token);
  9. token = strtok(NULL, ";" );
  10. strcpy(chaine2, token);
  11. token = strtok(NULL, ";" );
  12. strcpy(chaine3, token);
  13. token = strtok(NULL, ";" );
  14. return 0;
  15. }


 
chaine1 -> Salut les amis
chaine2 -> Cool
chaine3 -> NULL (et plantage au strcpy forcement :D)


Message édité par godbout le 26-06-2002 à 12:02:06

---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 12:30:21    

Bon ben je crois que je vais etre oblige de me retaper le fichier caractere par caractere, tu parles d'une facon de programmer...


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 13:06:19    

Godbout a écrit a écrit :

Bon ben je crois que je vais etre oblige de me retaper le fichier caractere par caractere, tu parles d'une facon de programmer...




 
Meu non.
Essaye avec strchr.

Code :
  1. char *start,*end;
  2. start = buffer;
  3. end   = strchr(buffer,';');
  4. if(end)
  5. {
  6.     *end = '\0';
  7. }


 
Et tu traite ce qu'il y a entre les deux, ensuite tu fait:
 

Code :
  1. start = end + 1;
  2. end   = strchr(start,';');


 
Et tu boucle.


---------------
Le Tyran
Reply

Marsh Posté le 26-06-2002 à 13:32:02    

Ouais mais nan, je peux pas faire de boucle a cause des differents champs de ma struct :/
 
J'ai deja un algo qui marche mais c'est usine a gaz, je pensais que scanf aurait marche.


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 15:27:09    

pourquoi ne pas utiliser les string et leur find ?

Reply

Marsh Posté le 26-06-2002 à 15:32:37    

Si j'ai bien compris tu connais, à la lecturede la ligne, le nombre de champ et leur types, non? Ben tu met les info de types dans un tableau, tu fait une boucle avec dednas un switch ou un tableau de pointeur de fonction, au choix, qui effectue le traitement adéquat.


---------------
Le Tyran
Reply

Marsh Posté le 26-06-2002 à 15:48:19    

letoII a écrit a écrit :

Si j'ai bien compris tu connais, à la lecturede la ligne, le nombre de champ et leur types, non? Ben tu met les info de types dans un tableau, tu fait une boucle avec dednas un switch ou un tableau de pointeur de fonction, au choix, qui effectue le traitement adéquat.




 
C'est EXACTEMENT ce que j'avais deja fait ;)
Je voulais ameliorer un peu le truc.


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 15:48:46    

BENB a écrit a écrit :

pourquoi ne pas utiliser les string et leur find ?




 
J'ai essaye mais j'ai vite laisse tomber :D
Je crois que j'ai bcp de lacune sur tout ce qui est c++, je code encore a la facon iut :/


---------------
Super.
Reply

Marsh Posté le 26-06-2002 à 15:51:40    

Code :
  1. string word[NBWORD];
  2. string line(buffer); //buffer est un char* contenant la chaine a traiter
  3. size_type start=0;
  4. size_type stop=0;
  5. stop = line.find(';');
  6. for(size_type index=0;stop != line.npos; index++)
  7. {
  8.   word[index] = line.substr(start,stop-start);
  9.   start = stop+1;
  10.   stop = line.find(';',start);
  11. }


et tu retrouves dans le tableau word chacun de tes champs...

Reply

Marsh Posté le 26-06-2002 à 16:09:12    

Godbout a écrit a écrit :

 
 
C'est EXACTEMENT ce que j'avais deja fait ;)
Je voulais ameliorer un peu le truc.




 
je vois pas ce qu'il y a à améliorer. Qu'est ce que tu crois qu'il y a derrière le scanf?


---------------
Le Tyran
Reply

Marsh Posté le 27-06-2002 à 09:13:40    

BENB -> :jap:
 
LetoII -> nan ben c'est pas grave en fait tant pis :D


---------------
Super.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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