begin process at 2012 02 09 07:27:17
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Astuces

 > TRANSFORMER UN INT/DOUBLE... EN CHAINE DE CARACTÈRES DE TYPE STRING EN CPP [GCC]

TRANSFORMER UN INT/DOUBLE... EN CHAINE DE CARACTÈRES DE TYPE STRING EN CPP [GCC]


 Information sur la source

Note :
6 / 10 - par 2 personnes
6,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Astuces Classé sous :transformer, int, double, stl Niveau :Débutant Date de création :24/07/2003 Date de mise à jour :18/12/2005 23:05:40 Vu :12 235

Auteur : ADPro22

Ecrire un message privé
Site perso
Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

 Description

Voici une petite astuce utilisant les flux pour transformer tout type de données en chaine de caractères en C++ (classe string de la STL) sans utiliser les fonctions du langage C (itoa, etc.).

Pour cela, les données à mettre dans la chaine sont placées dans un flux temporaire de type stringstream.

Voici un exemple trivial pour illustrer le fonctionnement avec un double :

Source

  • // Flux d'entrée/sortie standards (juste pour le cout)
  • #include <iostream>
  • // Flux de chaine de caractères pour les flux stringstream
  • #include <sstream>
  • using namespace std;
  • int main()
  • {
  • string s;
  • stringstream sstr;
  • double pi=3.14159;
  • // on met le double dans le flux sstr
  • sstr << pi;
  • // on écrit dans la chaine s
  • sstr >> s;
  • // on affiche la chaine contenant le double
  • cout << s;
  • return 0;
  • }
// Flux d'entrée/sortie standards (juste pour le cout)
#include <iostream>
// Flux de chaine de caractères pour les flux stringstream
#include <sstream>

using namespace std;

int main()
{
  string s;
  stringstream sstr;
  double pi=3.14159;

  // on met le double dans le flux sstr
  sstr << pi;
  // on écrit dans la chaine s
  sstr >> s;

  // on affiche la chaine contenant le double
  cout << s;

  return 0;
}

 Conclusion

Une fois dans une chaine string, vous pouvez facilement manipuler vos données avec la classe string de la STL.



Compilé avec gcc 3.2


 Historique

18 décembre 2005 23:05:41 :
- maj mots clefs

 Sources du même auteur

Source avec Zip ICONE DANS LA BARRE DES TACHES AVEC MENU (VC++)
Source avec Zip SERVEUR/CLIENT SOUS WINDOWS EN MODE CONSOLE (VC++,DEVCPP,BOR...
Source avec Zip CLASSE DE CALCUL MATRICIEL (VC++ ET DEVCPP)
CLASSE DE CALCUL MATRICIEL (VC++ ET DEVCPP)
3 EXEMPLES DE TRIS (DEVC++ VC++)

 Sources de la même categorie

Source avec Zip SCHEDULER RR FIFO par yvesB87
Source avec Zip ALGORITHMES RÉCURSIFS VS ALGORITHMES ITÉRATIFS par yvesB87
Source avec Zip Source avec une capture C++ FORMAT D'IMAGE AVEC QT par pop70
Source avec une capture EXEMPLE DE POINTEURS DE FONCTION par pop70
Source avec Zip Source avec une capture [C++] CLASS REGISTER par Miwik

 Sources en rapport avec celle ci

PERFORMANCE DE DIFFÉRENTS CONTAINERS DE LA STL par TeddyBear94
Source avec Zip CALLOCATOR par troctsch
Source avec une capture MAP STL ET ARBRES ROUGES ET NOIRS par guill76
Source avec une capture CALCUL DE L'ENVELOPPE CONVEXE D'UN NUAGE DE POINTS DANS UN P... par Lucky92
Source avec Zip Source avec une capture ORDRE DE SOMMATION DES FLOTTANTS (EXEMPLE PAR SIMULATION) par JCDjcd

Commentaires et avis

Commentaire de Funto66 le 25/07/2003 08:30:47

Ouais, c'est sympa, mais tout ça ne marche pas sous VC++ 6 :(
Y'a pas de "string" :( Dommage...

Commentaire de tibur le 25/07/2003 09:09:13

Ajoutes std:: devant les noms de types string et stringstream
ca te donnes :

std::string s;
std::stringstream sstr;

et pis aussi std::cout

Commentaire de Funto66 le 25/07/2003 11:41:32

Honte à moi !! Ca fait un bon moment que je le savais, et j'ai dû oublier de mettre using namespace std; quand j'ai fait le test !!
Merci bcp tibur ! Ca me sort 27 warnings mais ça marce qd même alors je m'en fous :D

Commentaire de Kirua le 08/08/2003 02:29:26

oui VC++ aime pas trop le C++ conforme à ce que j'ai pu voir ;-)
c'est une chouette astuce, merci ! :-)

pr utiliser les string il faut pas inclure &lt;string.h&gt; ??

Commentaire de Funto66 le 08/08/2003 10:17:03

Kirua &gt;&gt; il ne faut pas mélanger les bibliothèques C et C++ : pour utiliser les fonctions de gestion de chaînes de caractères du C (strcpy(), strcat(), strcmp()...etc) il faut faire un #include &lt;string.h&gt;.
Par contre, pour les headers de la bibliothèque standard du C++, il ne faut jamais mettre le .h, donc pour utiliser les string il faut faire :
#include &lt;string&gt;
using namespace std; // A mettre toujours si l'on utilise un fichier de la bibliothèque standard du C++, comme &lt;iostream&gt;, &lt;vector&gt;...etc.

Commentaire de tibur le 08/08/2003 12:41:43

Concernant le "using namespace std;", Je pense qu'il faut eviter de l'utiliser, et plutot specifier directement std:: devant les fonctions de la STL.

Le but du namespace est de faire des 'packages' contenant des fonctions et des classes c++.

Cela evite d'avoir des conflits entre les noms de classes en integrant le travail de quelqu'un d'autre ...
(Genre si ce quelqu'un a codé une classe string ou list, elle va entrer en collision avec celle de la STL)

Enfin, tout ca pour dire que la clause 'using namespace' devrait etre contre indiquée la plupart du temps.

Commentaire de Funto66 le 08/08/2003 13:42:30

C'est vrai que ça enlève l'avantage du système de namespace...
Perso, j'aime pas les namespace, je préfère la bonne vieille méthode où on place un préfixe genre gl ou wx ou gtk_...
Et puis ce quelqu'un n'avait pas qu'à faire ça ! :D

Commentaire de Kirua le 08/08/2003 18:05:22

merci funto, je savais que pr les bib standards il ne fallait pas mettre le .h, mais je me souviens très nettement qu'une fois un test avait raté à cause de ça, mais il y avait probablement d'autres facteurs, peut-être que mon compilo était en mode C, qui c? ;-)

je trovue que c allourdir le code, quand on peut se passer d'une résolutino de portée, autant en profiter non? en cas de doute du compilo, il est facile de préciser ponctuellement non ?

Commentaire de Funto66 le 08/08/2003 19:02:01

Je suis d'accord avec Kirua.
En +, comme tu l'as dis, on peut toujours préciser ponctuellement.

Commentaire de lgammacurta le 12/01/2005 18:59:51

Merci pour cette astuce à la fois simple à mettre en oeuvre et efficace. J'ai cherché de mon côté un moyen pour convertir un int en string mais je n'avais rien trouvé d'aussi simple. Bien vu!

Commentaire de hsaturn le 07/10/2005 14:16:52

// I think a lot better solution for this problem is to use templates :

// *********************************
// BEGIN OF YOU JUST NEED THAT
// *********************************
#include <iostream>
#include <string>
#include <sstream>

using namespace std; // Ugly, but for a demo...

template< class T>
    inline string to_string( const T & Value)
{
    stringstream streamOut;
    streamOut << Value;
    return streamOut.str( );
}
// *********************************
// END OF YOU JUST NEED THAT
// *********************************

// *********************************
// BEGIN OF SMALL EXAMPLE
// *********************************

// Thus, you can convert almost all what you what to string.

// Also, this method may write for any kind of object if you provide a friend ostream operator <<
// Example
class cool
{
  public:
    cool(int i,string s) : mi(i),ms(s){};

    friend ostream &operator << (ostream &out,const cool &o);

  private:
    string ms;
    int mi;
};

ostream &operator << (ostream &out,const cool &o)
{
  out << "cool {" << o.mi << "," << o.ms << "};" << endl;
  return out;
}

// An example of all that :
int main(int argc,char* argv[])
{
  string sFloat=to_string(1.2);
  string sLong=to_string(1234);
  cool   mycool(1,"Great");

  // And this solves this problem too
  // The following line may break your compiler !
  //string sBad="cool"+"titi";

  // This one is ok
  string sOk=to_string("cool")+" isn't it ?";

  cout << "float=" << sFloat << endl;
  cout << "long=" << sLong  << endl;
  cout << "ok=" << sOk      << endl;

  string scool=to_string(mycool);

  cout << "mycool=" << scool << endl;

  // Note : just for that, you could have writte cout << mycool << endl;

  cout << mycool << endl;

  return 0;
}

// *********************************
// END OF SMALL EXAMPLE
// *********************************

Commentaire de hsaturn le 07/10/2005 14:18:38

Ooops, désolé pour le post précédent... rédigé en langue de Shakespeare. Je me suis trompé de bonhomme. Molière s'est-il retourné dans sa tombe ?
Je traduis si qqun ne comprend pas.
Oualou !

Commentaire de Cethywolf le 02/05/2006 13:34:47

Très simpa et pratique ce code, merci !

Encore mieux le template ^^

Commentaire de Cethywolf le 02/05/2006 13:48:38

Par contre, j'aimerais que explique le header de ton template, particulièrement "inline".
Merci.

Commentaire de Kirua le 03/05/2006 23:25:29

c'est posté en anglais, mais on avait bien compris que tu parlais français ;)

Commentaire de hsaturn le 18/05/2006 00:08:35

Ooops désolé pour la réponse tardive...

Le inline c'est juste histoire d'optimiser. En fait, le compilateur reprend à chaque fois le code et le copie colle à l'endroit de l'appel de la fonction.

On peut oublier et supprimer le inline. Le code fonctionnera de la même manière, surtout si on appele peu cette fonction. D'ailleurs, le inline permet d'aller un peu plus vite, mais cela a un coût : le code est plus gros...

Pour info, ce code est tiré d'une classe CString que j'ai créée pour mes propres besoins. Si ça interresse qqu'un d'avoir CString, yakademander.

Ouala !

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Aide [ par eikonos ] Je travail sur une dll appellé psfg.dllj'ai ces lignes suivant de codetypedef struct CAMERAPARAM_tag{int nGain;int nOffset;int bOffsetFix;int nUpperLi tableau a double entrée alloué dynamiquement [ par amortlintelligence ] Voila j'aurais voulu utiliser un tableau (tableau de tableau) dans une fonction. Je pense qu'il faut donc que je le crée dynamiquement avec un code du probleme cast [ par morgandetoi06 ] svp aidez moi...j utilise la fonction pow qui renvoie un doubledonc je fait double b; // nombredouble j; // exposantdouble n; // reponsen=pow(b,j);don STL : fonction size [ par UbuRoi ] cout&lt;&lt;UnitStack.size()&lt;&lt;endl;warning C4267: 'argument' : conversion from 'size_t' to 'unsigned int', possible loss of dataPourquoi diable cosinus [ par anek971 ] Bonjour ,ben avt de demander de l'aide j'ai chercher sur le forum mais ya pas le programme en c.Et en faite c juste pr une verification car mon progra List STL [ par gribgrib ] Salut,J'espere que quelqu'un pourra m'aiderVoila mon problème : j'insère des structures dans uns list mais une fois toutes mes structures insérées dan Segmentation Fault....en traitement d'image [ par psysta ] Bonjour,je suis nouveau dans la programmation en C. J'ai un programme Matlab qui marche bien, et je souhaiterais l'implémenter en C. Le pgm compile bi class matrice [ par flaky ] Slt à tousJ'utilise une classe "matrice" (celle de nicolas aunai, téléchargée sur le site) qui fonctionne très bien. Mais j'ai du mal à manipuler l'ob C++ de merde...enfin je veux dire... [ par brindillee ] Salut,J'ai un petit soucis qui me cause des grands soucis...Voila j'ai choppé une fonction de décomposition (svd...) en C++ sur le net mais je n'arriv Lecture d'un fichier quelconque [ par jb60 ] Bonjour,J'aimerais savoir si il est possible de lire les données d'un fichier quelconque lorsqu'on ne connait pas le format du fichier d'origine... Je


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,713 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales