Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1044 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C, C++] Bidouille avec sscanf

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C, C++] Bidouille avec sscanf

n°166147
godbout
Génial.
Posté le 26-06-2002 à 11:14:24  profilanswer
 

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.
mood
Publicité
Posté le 26-06-2002 à 11:14:24  profilanswer
 

n°166152
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 11:16:49  profilanswer
 

c quoi exactement la structure de ton fichier?


---------------
Le Tyran
n°166154
godbout
Génial.
Posté le 26-06-2002 à 11:19:09  profilanswer
 

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.
n°166157
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-06-2002 à 11:19:26  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°166171
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 11:25:20  profilanswer
 

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
n°166233
BENB
100% Lux.
Posté le 26-06-2002 à 11:45:27  profilanswer
 

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...

n°166251
godbout
Génial.
Posté le 26-06-2002 à 11:52:22  profilanswer
 

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.
n°166259
antp
Super Administrateur
Champion des excuses bidons
Posté le 26-06-2002 à 11:56:22  profilanswer
 

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


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°166267
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 11:58:39  profilanswer
 

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


---------------
Le Tyran
n°166273
godbout
Génial.
Posté le 26-06-2002 à 12:00:43  profilanswer
 

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


---------------
Super.
mood
Publicité
Posté le 26-06-2002 à 12:00:43  profilanswer
 

n°166274
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 12:00:45  profilanswer
 

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
n°166277
godbout
Génial.
Posté le 26-06-2002 à 12:01:49  profilanswer
 

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.
n°166307
godbout
Génial.
Posté le 26-06-2002 à 12:30:21  profilanswer
 

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.
n°166318
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 13:06:19  profilanswer
 

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
n°166327
godbout
Génial.
Posté le 26-06-2002 à 13:32:02  profilanswer
 

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.
n°166461
BENB
100% Lux.
Posté le 26-06-2002 à 15:27:09  profilanswer
 

pourquoi ne pas utiliser les string et leur find ?

n°166463
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 15:32:37  profilanswer
 

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
n°166491
godbout
Génial.
Posté le 26-06-2002 à 15:48:19  profilanswer
 

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.
n°166492
godbout
Génial.
Posté le 26-06-2002 à 15:48:46  profilanswer
 

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.
n°166497
BENB
100% Lux.
Posté le 26-06-2002 à 15:51:40  profilanswer
 

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...

n°166523
LetoII
Le dormeur doit se réveiller
Posté le 26-06-2002 à 16:09:12  profilanswer
 

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
n°166887
godbout
Génial.
Posté le 27-06-2002 à 09:13:40  profilanswer
 

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


---------------
Super.
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C, C++] Bidouille avec sscanf

 

Sujets relatifs
aide rapide sscanf[Win32 et bidouille] Pomme d'API , memory DC et ses joyeux amis....
JAVASCRIPT: bidouille sur FRAMES 
Plus de sujets relatifs à : [C, C++] Bidouille avec sscanf


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR