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

Langage C++ Discussion :

std::string en const WCHAR*


Sujet :

Langage C++

  1. #1
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut std::string en const WCHAR*
    Bonjour à tous,

    Dans le cadre d'un projet, je dois implémenter (entre autres!) une fonction toute simple qui prend en entrée le chemin d'une image au format PNG32. Je dois ensuite ouvrir cette image (l'idéal étant de charger les pixels par exemple dans un tableau à deux dimension) et coloriser quelques pixels dont j'ai les coordonnées. Enfin, j'ai juste à enregistré l'image obtenues dans un autre fichier .png. Je n'ai pas du tout besoin d'afficher l'image à quelque moment que ce soit.

    J'ai vu notamment dans la FAQ qu'il existe pas mal de libs permettant de manipuler des images mais d'une part je ne sais pas trop quoi choisir et d'autre part, l'idéal pour ce projet serait de ne pas utiliser de libs externes (autant que possible). L'appli que je code est en VC++ donc peut-être quelque chose du côté des MFC...

    Que me conseillez-vous pour faire ça?


    [EDIT] : Precision supplementaire : Pour faciliter éventuellement la manipulation, j'ai la possibilité d'avoir en entrée/sortie un PNG8, PNG32, GIF ou JPG.

  2. #2
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    Bon, j'ai choisi de partir sur GDI+.

    Nouveau problème : Comment convertir un std::string en const WCHAR* ?

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    en passant par un std::wstring ?

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    en passant par un std::wstring ?
    Et ça se fait comment? As-tu quelque chose de plus simple que:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    std::wstring widen(std::string const& s, std::locale loc = std::locale())
    {
        std::char_traits<wchar_t>::state_type state = { 0 };
     
        typedef std::codecvt<wchar_t, char, std::char_traits<wchar_t>::state_type >
            ConverterFacet;
     
        ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));
     
        char const* nextToRead = s.data();
        wchar_t buffer[BUFSIZ];
        wchar_t* nextToWrite;
        std::codecvt_base::result result;
        std::wstring wresult;
     
        while ((result
                = converter.in
                      (state,
                       nextToRead, s.data()+s.size(), nextToRead,
                       buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
               == std::codecvt_base::partial)
        {
            wresult.append(buffer, nextToWrite);
        }
     
        if (result == std::codecvt_base::error) {
            throw std::runtime_error("Encoding error");
        }
        wresult.append(buffer, nextToWrite);
        return wresult;
    }
     
    std::string narrow(std::wstring const& s, std::locale loc = std::locale())
    {
        std::char_traits<wchar_t>::state_type state = { 0 };
     
        typedef std::codecvt<char, wchar_t, std::char_traits<wchar_t>::state_type >
            ConverterFacet;
     
        ConverterFacet const& converter(std::use_facet<ConverterFacet>(loc));
     
        wchar_t const* nextToRead = s.data();
        char buffer[BUFSIZ];
        char* nextToWrite;
        std::codecvt_base::result result;
        std::string sresult;
     
        while ((result
                = converter.in
                      (state,
                       nextToRead, s.data()+s.size(), nextToRead,
                       buffer, buffer+sizeof(buffer)/sizeof(*buffer), nextToWrite))
               == std::codecvt_base::partial)
        {
            sresult.append(buffer, nextToWrite);
        }
     
        if (result == std::codecvt_base::error) {
            throw std::runtime_error("Encoding error");
        }
        sresult.append(buffer, nextToWrite);
        return sresult;
    }

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    En fait, j'ai la version avec API Microsoft et pas en C++ pur et dur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::wstring s2ws(const std::string& s)
    {
     int slength = s.length() + 1;
     int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
     wchar_t* buf = new wchar_t[len];
     MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
     std::wstring r(buf);
     delete[] buf;
     return r;
    }

  6. #6
    Membre habitué

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 129
    Points
    129
    Par défaut
    En parcourant la MSDN, j'ai pu trouver ce bout de code qui a bien fonctionné pour moi en passant par des const char* :

    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
     
    std::string str = "chaîne à convertir";
     
    //Y'a surement moyen de faire mieux que ça pour newsize!
    const size_t newsize = 256;
     
    size_t origsize = strlen(str.c_str()) + 1;
    size_t convertedChars = 0;
    wchar_t wcstring[newsize];
     
    mbstowcs_s ( 
    &convertedChars,
    wcstring,
    origsize,
    str.c_str(),
    _TRUNCATE);

Discussions similaires

  1. conversion const std::string et const char * ?
    Par panthere noire dans le forum C++
    Réponses: 7
    Dernier message: 28/02/2011, 16h51
  2. std::string ou const char*
    Par amineabm dans le forum Débuter
    Réponses: 14
    Dernier message: 01/02/2011, 11h12
  3. Conversion const char* vers std::string
    Par scheme dans le forum C++
    Réponses: 4
    Dernier message: 21/09/2010, 12h02
  4. cannot convert 'std::string' to 'System::String ^'
    Par broadhead dans le forum MFC
    Réponses: 1
    Dernier message: 14/06/2005, 12h37
  5. std::string, operator =
    Par tut dans le forum SL & STL
    Réponses: 10
    Dernier message: 05/11/2004, 13h07

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