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

  FORUM HardWare.fr
  Programmation
  C++

  erreur sur stringstream surrement simple mais pas trouvée encore

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

erreur sur stringstream surrement simple mais pas trouvée encore

n°1951523
mandagor
GAZZzzzzz.......
Posté le 18-12-2009 à 13:45:13  profilanswer
 

bonjour à tous, j'ai un soucis avec l'utilisation de string/stringstream et int.
je décode une date contenu dans une chaine de caractères du type "18/12/09 10:36:00"
 
sauf que mon algo ne marche que la premiere itération

Code :
  1. time_t rawtime;
  2. struct tm * timeinfo=new tm;
  3. string str;
  4. stringstream myStream (stringstream::in | stringstream::out);
  5. int iTemp[6]={0};
  6. int it=0;
  7. for(int i=0;i<=15;i+=3)
  8.  {
  9.   myStream.str("" );
  10.   str.assign(DateString.substr(i,2));
  11.   myStream<<str;      //string to stringstream
  12.   cout<<str;   //debug
  13.   myStream>>iTemp[it];     //stringstream to int
  14.   it++;
  15.  }
  16.  timeinfo->tm_mday=iTemp[0];
  17.  timeinfo->tm_mon=iTemp[1];
  18.  timeinfo->tm_year=iTemp[2];
  19.  timeinfo->tm_hour=iTemp[3];
  20.  timeinfo->tm_min=iTemp[4];
  21.  timeinfo->tm_sec=iTemp[5];
  22.  rawtime=mktime(timeinfo);


le probleme c'est que la premiere valeur est juste pour iTemp et str ("18" )
mais les autres boucles ne marchent pas.  
str prend bien les valeurs "12" "09" "10" "36"  "00" mais iTemp reste à {18,0,0,0,0,0}
 
ça doit être tout bete mais je vois pas  :??:  
 
merci pour le coup de main


---------------
Mes ventes vers Grenoble & Gresivaudan
mood
Publicité
Posté le 18-12-2009 à 13:45:13  profilanswer
 

n°1951535
Joel F
Real men use unique_ptr
Posté le 18-12-2009 à 14:25:16  profilanswer
 

tu remplis iTemp[it] et non iTemp[i]

 

sinon:utilise boost::date_time y a ce qui faut pour faire ça de manière automatique

Message cité 1 fois
Message édité par Joel F le 18-12-2009 à 14:25:59
n°1951543
Elmoricq
Modérateur
Posté le 18-12-2009 à 14:40:25  profilanswer
 

Joel F a écrit :

tu remplis iTemp[it] et non iTemp[i]


C'est le but, i s'incrémentant par pas de 3.

n°1951544
theshockwa​ve
I work at a firm named Koslow
Posté le 18-12-2009 à 14:44:04  profilanswer
 

pourquoi recréer ton stream à chaque fois ?  :sweat:  
 
Comme Joël l'a suggéré, mate du côté de boost, ils ont sans doute quelque chose pour t'éviter de te prendre la tête
 
Sinon, au moins, crée ton stream une bonne fois, tu alternes les lectures d'entier / caractère de séparation en vérifiant que les données que tu lis sont bien valides et basta, y'a même pas besoin de faire une boucle pour ca.


---------------
last.fm
n°1951547
Joel F
Real men use unique_ptr
Posté le 18-12-2009 à 14:45:28  profilanswer
 

Elmoricq a écrit :


C'est le but, i s'incrémentant par pas de 3.


arf mal vu

n°1951554
mandagor
GAZZzzzzz.......
Posté le 18-12-2009 à 15:18:33  profilanswer
 

ok je vais chercher du coté de Boost (connais pas)

 

sinon mon stream est créé une seule fois avec

Code :
  1. stringstream myStream (stringstream::in | stringstream::out);


j'utilise juste myStream.str("" ); pour le vider.

 

pour la boucle, je m'en passais avant en faisant des lecture/ecriture avec mon stream l'une apres l'autre mais le résultat était le même.

 

bon je regarde du coté de boost mais j'aurai voulu comprendre pourquoi ça ne marche pas là.


Message édité par mandagor le 18-12-2009 à 15:21:57

---------------
Mes ventes vers Grenoble & Gresivaudan
n°1951580
theshockwa​ve
I work at a firm named Koslow
Posté le 18-12-2009 à 16:39:35  profilanswer
 

Code :
  1. for(int i=0;i<=15;i+=3)
  2. {
  3.   std::istringstream myStream( DateString.substr(i,2));
  4.   myStream>>iTemp[it];     //stringstream to int  
  5.   it++;
  6. }


 
rien qu'en faisant ca, ca ne te résoud pas des soucis ?


---------------
last.fm
n°1951789
__tomjost
c'est un pseudo !
Posté le 19-12-2009 à 23:26:57  profilanswer
 

quelque commentaire.....

Code :
  1. int iTemp[6]={0};
  2. # int it=0;
  3. #
  4. # for(int i=0;i<=15;i+=3)
  5. #  {
  6. #   myStream.str("" );
  7. #   str.assign(DateString.substr(i,2));
  8. #   myStream<<str;      //string to stringstream
  9. #   cout<<str;   //debug
  10. #   myStream>>iTemp[it];     //stringstream to int
  11. #   it++;
  12. #  }
  13. #  timeinfo->tm_mday=iTemp[0];


c'est bizarre! myStream>>iTemp[it]; , je dois tester
ca quand je demarre linux
...pour maintenant je vois qui'il ya une function  
deja definie (op override) pour array
.. alors si on met quelqu parethese , ou casting ?
Quand on a changer au std:: , cette function
n'est pas defini avec ce namespace (   :??: ..je crois!)
 
myStream.str("" ); dans la loop , c'est du sport  :lol:  
 
 
 
 
 
 

n°1971825
__tomjost
c'est un pseudo !
Posté le 07-03-2010 à 23:12:23  profilanswer
 

__tomjost a écrit :


.....deja definie (op override)....


il veut dire operator overload !  :D

   

for(int i=0;i<=15;i+=3)
 {
  str.assign(DateString.substr(i,2));
  myStream<<str;      //string to stringstream
  cout<<str;   //debug
  myStream>>iTemp[it];     //stringstream to int
  it++;
 }

 

l'example est similair a un queue entre deux thread..

 

ici myStream  herite de iostream , et le buffer est partatger
entre ostream , istream.

 

// myStream<<str;

 

on insert 2 chars -> le ptr egptr(end getptr) se deplace de 2
-> maintenant le buffer que voit istream et de 2 char ,
apres extraction , istream arrive a la fin ,  ios::eof bit est marquer(set)
et tout function qui suit 'fail' en silence apres.

 

1/ call myStream.clear(0) enleve le bit de eof (tout avec un 0 ) ,
et on continue normalement ,  mais dans ce cas l'allocation de memoire continue. (je ne sais pas si il y a une limite)
 alors il faut ajouter myStream.seekp(0); myStream.seekg(0); , les curseurs
 retourne  au debut... , sans prendre plus de memoire.

 

2/ autre solution pour ne pas causer l'eof est myStream<<str<<endl;
  istream ne prend(extract) pas '\n'... et pas d'eof (on met 3 on prend 2)
 (mais toujours avec seekp(0) , seekg(0) pour la memoire )

 

3/ on peut aussi mettre le tout dans un try/catch et activer l'exception
 'MyStream.exceptions(ios::eofbit)' pour l'eof , ... un exception a 'handler'
 chaque fois eofbit est 'set' .

 

-> il'ya toujours autre solution pour eviter le tout.

 

moi j'ai souvent utiliser quelque printf()/sprintf() pour ca.

 

je sais que ce sujet est .... , mais j'ai trouver cette page dans
un dossier , (il n ya pas d'autre!), et je trouve quelque temps
pour voir le problem .

 

oui , je sais c'est un peu mal expliquer...  :ange:
excusez moi pour tout derangement!


Message édité par __tomjost le 07-03-2010 à 23:24:20

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

  erreur sur stringstream surrement simple mais pas trouvée encore

 

Sujets relatifs
stringstream conversion en int 5e+006 => 5Message d'erreur NetBeans
Démineur erreur de segmentation[PHP/Access] Erreur ODBC
[C] Programme simpleErreur de compilation Java "cannot find symbol" sous ubuntu 9.04
j'ai besoin d'un script commerce simple commeQuel tuto pour un formulaire php simple? (NOVICE)
[c] erreur de segmentationEmpecher l'erreur lors du chargement du XML
Plus de sujets relatifs à : erreur sur stringstream surrement simple mais pas trouvée encore


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