IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

de Tchar[2048] � String


Sujet :

C++Builder

  1. #1
    Membre �clair�
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par d�faut de Tchar[2048] � String
    Bonjour,

    Je dois retourner un string, mais ma variable est de type Tchar[2048], comment faire ?
    Est-ce que quelqu'un connait, en c++ (car des moyens existent sous d'autres langages) pour convertir un TCHAR[2048] vers un string ??

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void CPauseResumeDemoDlg::GetLastResponse(string& strResponse)
    {
    	DWORD dwError;
    	TCHAR tpszBuff[2*1024];
    	DWORD dwBuffLen = 2*1024;
    	BOOL bRet = InternetGetLastResponseInfo(&dwError, tpszBuff, &dwBuffLen); 
    	strResponse = tpszBuff;
    }

    NB : j'ai essayer de tout passer en tchar*, mais ca a fait n'importe quoi (parceque j'ai fais n'importe quoi )

  2. #2
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    System::String ou std::string ?

    Edit : Pour une std::string :
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    std::string TcharsToString(TCHAR const * scz)
    {
        std::ostringstream ossA;
        ossA << scz;
        return ossA.str();
    }

    Ou plus optimis�, si les performances sont critiques :
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::string TcharsToString(TCHAR const * scz)
    {
        #ifdef UNICODE
        std::ostringstream ossA;
        ossA << scz;
        return ossA.str();
        #else
        return scz;
        #endif
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Ou plus conforme � la philosophie Windows:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    inline std::string CharsToStringA(char const * const scz)
    {
    	return scz;
    }
     
    inline std::string CharsToStringW(wchar_t const * const scz)
    {
    	std::ostringstream ossA;
    	ossA << scz;
    	return ossA.str();
    }
     
    #ifdef UNICODE
    #define CharsToString CharsToStringW
    #else
    #define CharsToString CharsToStringA
    #endif
    Tu peux utiliser ce code dans un fichier d'en-t�te : Il d�clare deux fonctions, les d�finit en inline (tu peux aussi les mettre s�par�ment dans un fichier source), et fait les define pour utiliser automatiquement la bonne fonction selon le type de TCHAR.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre �m�rite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par d�faut
    Citation Envoy� par M�dinoc
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::string TcharsToString(TCHAR const * scz)
    {
        #ifdef UNICODE
        std::ostringstream ossA;
        ossA << scz;
        return ossA.str();
        #else
        return scz;
        #endif
    }
    Attention, en unicode, ceci mettra la valeur du pointeur scz dans le r�sultat et non pas son contenu.

  5. #5
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Erreur: Consid�rer le texte gris comme barr�.
    Un stream a le m�me comportement pour un const char * et un const wchar_t * : Il �crit la cha�ne dans le flux.
    J'ai eu plusieurs fois l'occasion de jouer avec �a...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre �m�rite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par d�faut
    Ah, chez moi std::cout << L"hello" affiche "004B31A0", ce qui me semble logique, pour qu'il affiche "hello" il faudrait qu'il convertisse les wchar_t en char, ce qui n�cessite une locale.

  7. #7
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Je viens de tester sous Visual et sous nux, et je tombe de haut : C'est en effet le pointeur qui est affich�.
    La m�thode du ostringstream ne marche donc que dans le sens ASCII �tendu --> Unicode, mais pas le sens inverse.

    On est donc oblig� d'utiliser l'autre m�thode en C++, celle qui est dans la FAQ et impossible � retenir.
    http://c.developpez.com/faq/cpp/?pag...TRINGS_unicode.

    De plus, ce truc n'est-il pas un hack ? On dirait qu'il fait un acc�s direct en �criture sur le buffer d'une string, chose que le C++ est suppos� interdire!
    http://msdn2.microsoft.com/en-us/lib...f4(vs.80).aspx
    http://msdn2.microsoft.com/en-us/lib...ca(VS.80).aspx

    Autant utiliser directement les fonctions de conversion Win32, c'est carr�ment plus propre, bien que non-portable...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Je viens de regarder, en plus : Dans le choix de la locale, il n'y a rien de standard pour dire "Donne-moi un charset donn�". Les versions unixo�des prennent un nom de charset, alors que la version Windows n'accepte qu'un num�ro de codepage, et n'accepte PAS UTF-8, car elle prend plus de deux octets par caract�re...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre �clair�
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par d�faut
    C'est bien ca, ce que tu ad donn�, de developpez.com, fonctionne :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<typename T>
    std::string CPauseResumeDemoDlg::to_string( const T & Value )
    {
        // utiliser un flux de sortie pour créer la chaîne
        std::ostringstream oss;
        // écrire la valeur dans le flux
        oss << Value;
        // renvoyer une string
        return oss.str();
    }
    Thx

  10. #10
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Mais �a marche sur quoi ?
    Les tests ont montr� que �a ne marchait pas sur les wchar_t (�a affiche le pointeur ou la valeur � la place)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre �clair�
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Janvier 2007
    Messages
    387
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur Web
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 387
    Par d�faut
    Citation Envoy� par M�dinoc
    Mais �a marche sur quoi ?
    Les tests ont montr� que �a ne marchait pas sur les wchar_t (�a affiche le pointeur ou la valeur � la place)...

    Ca marche sur des TCHAR[2048] .
    Enfin, mon programme fonctionne correctement depuis les modifications, donc ...

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. cout, string et TCHAR
    Par camboui dans le forum C++
    R�ponses: 14
    Dernier message: 25/02/2010, 11h23
  2. Conversions : String->int et int->TCHAR
    Par CyberSlan dans le forum C++
    R�ponses: 10
    Dernier message: 13/06/2008, 15h12
  3. R�ponses: 2
    Dernier message: 25/04/2008, 06h37
  4. R�ponses: 4
    Dernier message: 07/05/2007, 20h05
  5. R�ponses: 6
    Dernier message: 10/03/2006, 09h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo