comment faire un cast d'un CString en int ?

comment faire un cast d'un CString en int ? - C++ - Programmation

Marsh Posté le 23-12-2005 à 19:49:10    

Salut,
tout est dans la question. le cast classique :
var = (int) var2  
ne marche pas.

Reply

Marsh Posté le 23-12-2005 à 19:49:10   

Reply

Marsh Posté le 23-12-2005 à 20:03:12    

Code :
  1. #include <sstream>
  2. int string2int( const CString& str )
  3. {
  4.    std::ostringstream str( LPCTSTR(str) );
  5.    int val;
  6.    str >> val;
  7.    return val;
  8. }

Reply

Marsh Posté le 23-12-2005 à 20:27:09    

Joel F a écrit :

Code :
  1. #include <sstream>
  2. int string2int( const CString& str )
  3. {
  4.    std::ostringstream str( LPCTSTR(str) );
  5.    int val;
  6.    str >> val;
  7.    return val;
  8. }



 
 
merci ! mais j'aurais quelques petites questions :
1)pkoi tu mets std:: devant ostringstream  
2)qu'est ce que ostringstream ? str() et LPCTSTR ?

Reply

Marsh Posté le 23-12-2005 à 20:33:45    

std :: c'est el namespace stadnard de la STL ou se trouve ostringstream
 
Ensuite : LPCSTR c'ets le type WIn32 pour pointeru sur char*, CString a un cast vers ce type.
 
le reste : http://www.cplusplus.com/ref/iostream/ostringstream/
 

Reply

Marsh Posté le 23-12-2005 à 20:36:32    

oké merci je vais jeter un oeuil

Reply

Marsh Posté le 23-12-2005 à 21:07:58    

j'ai essayé ça :  
 

Code :
  1. int string2int( const CString& chaine )
  2. {
  3.    std::ostringstream str( LPCTSTR(chaine) );
  4.    int entier;
  5.    str << entier;
  6.    return entier;
  7. }


 
mais ça me met cette erreur :
 
error C2296: '<<' : illegal, left operand has type 'class std::basic_ostringstream<char,struct std::char_traits<char>,class std::allocator<char> > (__cdecl *)(const char *)'

Reply

Marsh Posté le 23-12-2005 à 21:09:30    

hmmm c'est un istringstream qu'il te faut pardon, et utilise >>
 

Code :
  1. istringstream tmp( LPCSTR(str);
  2. int val;
  3. tmp >> str;
  4. return val;


 
ca m'apprendra a poster avec la grippe  :sweat:


Message édité par Joel F le 23-12-2005 à 21:10:31
Reply

Marsh Posté le 23-12-2005 à 21:15:16    

scuse moi mais a quel moment val est modifié ?

Reply

Marsh Posté le 23-12-2005 à 21:17:17    

j'ai mis istringstream et >> et j'ai tjs une erreur  
 
error C2296: '>>' : illegal, left operand has type 'class std::basic_istringstream<char,struct std::char_traits<char>,class std::allocator<char> > (__cdecl *)(const char *)'

Reply

Marsh Posté le 23-12-2005 à 21:43:35    

tmp >> val ...
 
bon je vais me coucher :
 

Code :
  1. int string2int( const CString& str )
  2. {
  3.   std::istringstream tmp( LPCTSTR(str) );
  4.   int val;
  5.   tmp>> val;
  6.   return val;
  7. }


Message édité par Joel F le 23-12-2005 à 21:44:07
Reply

Marsh Posté le 23-12-2005 à 21:43:35   

Reply

Marsh Posté le 24-12-2005 à 10:08:33    

Que se passe t'il si str ne représente pas un entier ?
 

Code :
  1. CString strNotANumber = _T("azerty" );
  2. int val = string2int(strNotANumber);
  3. // quelle est donc la valeur de val ?

Reply

Marsh Posté le 24-12-2005 à 10:27:30    

slash33 a écrit :

Que se passe t'il si str ne représente pas un entier ?
 

Code :
  1. CString strNotANumber = _T("azerty" );
  2. int val = string2int(strNotANumber);
  3. // quelle est donc la valeur de val ?



 
 
val n'est pas modifié.
 

Code :
  1. #include <iostream>
  2. #include <sstream>
  3. using namespace std;
  4. int main(int argc, char* argv[])
  5. {
  6. istringstream str( "azerty" );
  7. int val;
  8. cout << "val avant : " << val << endl;
  9. str >> val;
  10. cout << "val apres : " <<  val << endl;
  11. return 0;
  12. }


 


val avant : -85896060
val apres : -85896060


 
Mais je pense que c'est compilo-dependent


Message édité par Joel F le 24-12-2005 à 10:32:17
Reply

Marsh Posté le 24-12-2005 à 10:36:15    

Il y aurait peut être une astuce avec la méthode héritée ios::exceptions()
 
En fait l'opérateur << est hérité de la classe istream. Il faut probablement remonter l'héritage pour finir par comprendre ce qui se passe si la chaîne n'est pas du bon format.
 
La doc de isstringstream : http://www.cplusplus.com/ref/iostream/istringstream/
 
En fin de compte la solution réside peut être dans ios::fail()

Message cité 1 fois
Message édité par slash33 le 24-12-2005 à 10:43:12
Reply

Marsh Posté le 24-12-2005 à 10:42:39    

slash33 a écrit :

Il y aurait peut être une astuce avec la méthode héritée ios::exceptions()
 
En fait l'opérateur << est hérité de la classe istream. Il faut probablement remonter l'héritage pour finir par comprendre ce qui se passe si la chaîne n'est pas du bon format.


 
oui
 

Code :
  1. using namespace std;
  2. int main(int argc, char* argv[])
  3. {
  4. istringstream str( "33" );
  5. str.exceptions ( istringstream::failbit );
  6. istringstream str2( "azerty" );
  7. str2.exceptions ( istringstream::failbit );
  8. int val;
  9. cout << "avant val : " << val << endl;
  10. try
  11. {
  12.  str >> val;
  13. }
  14. catch( exception& e )
  15. {
  16.  cout << e.what() << endl;
  17. }
  18. cout<< "apres val : "  << val << endl;
  19. int val2;
  20. cout << "avant val2 : " << val2 << endl;
  21. try
  22. {
  23.  str2 >> val2;
  24. }
  25. catch( exception& e )
  26. {
  27.  cout << e.what() << endl;
  28. }
  29. cout << "apres val2 : "  << val2 << endl;
  30. return 0;
  31. }


 


avant val : -858993460
apres val : 33
 
avant val2 : -858993460
ios::failbit set
apres val2 : -858993460

Reply

Marsh Posté le 24-12-2005 à 10:46:37    

Joel F a écrit :



avant val : -858993460
apres val : 33
 
avant val2 : -858993460
ios::failbit set
apres val2 : -858993460



le e.what() ne présente pas un gros intérêt vu le message fourni.  :D

Reply

Marsh Posté le 24-12-2005 à 10:51:26    

bah si, en gros il te dit que le failbit est à 1 , donc que l'extraction a echoué

Reply

Marsh Posté le 24-12-2005 à 10:53:26    

D'après la doc d'ios::exceptions(), chaque classe stream a une collection d'exceptions qui lui est propre à la manière de ifstream::failure.
 
Je n'ai pas trouvé leur description dans la doc. :(
 
Edit: parlé trop vite -> http://www.cplusplus.com/ref/iostr [...] ilure.html


Message édité par slash33 le 24-12-2005 à 11:02:55
Reply

Sujets relatifs:

Leave a Replay

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