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

  FORUM HardWare.fr
  Programmation
  C++

  comment faire un cast d'un CString en int ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

comment faire un cast d'un CString en int ?

n°1272721
TheShot
Posté le 23-12-2005 à 19:49:10  profilanswer
 

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

mood
Publicité
Posté le 23-12-2005 à 19:49:10  profilanswer
 

n°1272724
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 20:03:12  profilanswer
 

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

n°1272739
TheShot
Posté le 23-12-2005 à 20:27:09  profilanswer
 

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 ?

n°1272740
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 20:33:45  profilanswer
 

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/
 

n°1272741
TheShot
Posté le 23-12-2005 à 20:36:32  profilanswer
 

oké merci je vais jeter un oeuil

n°1272747
TheShot
Posté le 23-12-2005 à 21:07:58  profilanswer
 

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 *)'

n°1272748
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 21:09:30  profilanswer
 

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
n°1272749
TheShot
Posté le 23-12-2005 à 21:15:16  profilanswer
 

scuse moi mais a quel moment val est modifié ?

n°1272750
TheShot
Posté le 23-12-2005 à 21:17:17  profilanswer
 

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 *)'

n°1272753
Joel F
Real men use unique_ptr
Posté le 23-12-2005 à 21:43:35  profilanswer
 

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
mood
Publicité
Posté le 23-12-2005 à 21:43:35  profilanswer
 

n°1272821
slash33
Posté le 24-12-2005 à 10:08:33  profilanswer
 

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 ?

n°1272823
Joel F
Real men use unique_ptr
Posté le 24-12-2005 à 10:27:30  profilanswer
 

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
n°1272825
slash33
Posté le 24-12-2005 à 10:36:15  profilanswer
 

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
n°1272827
Joel F
Real men use unique_ptr
Posté le 24-12-2005 à 10:42:39  profilanswer
 

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

n°1272829
slash33
Posté le 24-12-2005 à 10:46:37  profilanswer
 

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

n°1272830
Joel F
Real men use unique_ptr
Posté le 24-12-2005 à 10:51:26  profilanswer
 

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

n°1272831
slash33
Posté le 24-12-2005 à 10:53:26  profilanswer
 

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

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

  comment faire un cast d'un CString en int ?

 

Sujets relatifs
Cast dans un #define : questions[Cognos/ReportNet] Pb de cast
Cast??pas de cast as float sur mysql 4.0.x???
cast vers un pointeur sur tableau[.NET c#] exeption et probleme de cast
[c#] cast d'un object en intstatic_cast(x) vs (x)
[Visual C++]CString qui contient un #definecast de CString vers int
Plus de sujets relatifs à : comment faire un cast d'un CString en int ?


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)