erreur sur stringstream surrement simple mais pas trouvée encore

erreur sur stringstream surrement simple mais pas trouvée encore - C++ - Programmation

Marsh Posté le 18-12-2009 à 13:45:13    

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
Reply

Marsh Posté le 18-12-2009 à 13:45:13   

Reply

Marsh Posté le 18-12-2009 à 14:25:16    

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
Reply

Marsh Posté le 18-12-2009 à 14:40:25    

Joel F a écrit :

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


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

Reply

Marsh Posté le 18-12-2009 à 14:44:04    

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
Reply

Marsh Posté le 18-12-2009 à 14:45:28    

Elmoricq a écrit :


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


arf mal vu

Reply

Marsh Posté le 18-12-2009 à 15:18:33    

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
Reply

Marsh Posté le 18-12-2009 à 16:39:35    

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
Reply

Marsh Posté le 19-12-2009 à 23:26:57    

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:  
 
 
 
 
 
 

Reply

Marsh Posté le 07-03-2010 à 23:12:23    

__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
Reply

Sujets relatifs:

Leave a Replay

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