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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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 395
    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. [C++> C#]Comment régler problème de type TCHAR*/string ?
    Par fkerbourch dans le forum C++/CLI
    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