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++ Discussion :

[debutant] C++ et les "wide characters"


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut [debutant] C++ et les "wide characters"
    Bonjour.

    En C, quand je voulais lire ou écrire dans des fichier, j'utilisais des "FILE * fp", des "fopen", des "fgets" et "fputs", etc etc.

    En C++, je me suis mis a utiliser des ifstream pour la lecture et des ofstream pour l'ecriture, et tout allait bien jusqu'à ce que je doive utiliser des "wide characters". Comment faire?

    En C, je remplacait fgets par fgetws, fputs par fputws, etc...
    Mais en C++ je sais pas comment faire? Existe-t-il des wread, wwrite ou autres?

    plus précisément, si je veux par exemple lire la premiere lignes d'un fichier, écrit avec des wchar:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //un buffer pour stocker ce qu'on va lire dans le fichier:
    wchar_t pWideCharBuffer[MAX_EVENT_LINE_LENGTH];
    //un "inputstream:
    std::ifstream fis;
     
    //j'ouvre le fichier:
    fis.open(monFichier.txt)
     
    //et maintenant?
    je n'arrive pas a lire une ligne. j'ai pensé utiliser la fonction getline, avec les params suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fis.getline((char*)pWideCharBuffer,MAX_LINE_LENGTH*sizeof(wchar_t));
    MAX_LINE_LENGTH est une constante connue, elle vaut le nombre max de caracrtères qu'une ligne peut contenir. je la multiplie par sizeof(wchar_t) puisque la fonction getline remplit un buffer de char et non de wchar_t.
    Mais ça ne marche pas, il n'y a rien dans mon buffer. (notons que le premier caractère du fichier vaut 0xFF)
    En fait quand je dis qu'il n'y a rien dans mon buffer, c'est plutot que j'essaye d'afficher le contenu du buffer et que rien ne s'affiche, mais c'est peut etre l'affichage qui ne marche pas. j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wprintf(L"%s",pWideCharBuffer);
    de nouveau, pour afficher un char ou un wchar, en C je passe de printf a wprintf, mais en C++ ? est-ce que "cout" est assez intelligent pour afficher correctement le contenu de ma variable en tenant compte de son type?

    merci d'avance

  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
    En C++, il existe des wiostream.
    Si leur type n'est pas explicitement défini dans les headers (généralement un simple typedef comme ceux qui définissent ostream à partie du template basic_ostream), tu peux facilement faire le bon typedef toi-même (avec des wchar_t au lieu des chars)

    De même, il existe également wcin et wcout sur la plupart des systèmes supportant les wide-characters, mais ils ne marchent pas avec Dev-C++ par exemple...
    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
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Plus précisément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //un buffer pour stocker ce qu'on va lire dans le fichier:
    std::wstring WideCharBuffer;
     
    //un "inputstream:
    std::wifstream fis("monfichier.txt");
     
    std::getline(fis, WideCharBuffer);

  4. #4
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    merci beaucoup ça a l'air de marcher!

    EDIT:
    euh oui mais j'ai encore des problèmes:

    j'ai utilisé ton code, loulou24, et apres si je fais ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wcout<<wideCharBuffer.length()<<endl;
    j'obtient 82. Ce qui est bien la longueur de ma chaine (je l'ouvre en hexa dans un editeur et il y a bien 82 octets)
    par contre si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wcout<<wideCharBuffer.c_str()<<endl;
    il ne m'affiche que le debut de la chaine, et avec des erreurs, comme si il ne la lisait pas en "wide char"

    de plus, la chaine contient le mot-clé xml. les caractères x, m et l occupent les octets 6-7, 8-9, et 10-11. Mon but est de trouver ou se trouve la chaîne "xml". Si je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    i= wideCharBuffer.find(L'x',0);
    cout<<"i:"<<i<<endl;
    i= wideCharBuffer.find(L'm',0);
    cout<<"i:"<<i<<endl;
    i= wideCharBuffer.find(L'l',0);
    cout<<"i:"<<i<<endl;
    c'est bon, il m'affiche 6, 8 puis 10.

    mais si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    i= wideCharBuffer.find(L"xml",0);
    cout<<"i:"<<i<<endl;
    il m'affiche -1 ? comme si il ne trouve pas la chaîne "xml". qu'est-ce que je fais de faux?

    2eme EDIT:
    j'ajoute une question: pourquoi avec un "ifstream fis", je peux faire un "fis.getLine(...)" mais avec un "wifstream wfis" je ne peux pas faire un "wfis.getLine(...)" mais je dois faire un "std::getLine(wfis,...)" ?

    merci de votre aide.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Citation Envoyé par Biosox
    par contre si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    wcout<<wideCharBuffer.c_str()<<endl;
    il ne m'affiche que le debut de la chaine, et avec des erreurs, comme si il ne la lisait pas en "wide char"
    Aucune idée. Et si tu envoies directement ton std::wstring sans passer par sa fonction c_str() ?

    Citation Envoyé par Biosox
    j'ajoute une question: pourquoi avec un "ifstream fis", je peux faire un "fis.getLine(...)" mais avec un "wifstream wfis" je ne peux pas faire un "wfis.getLine(...)" mais je dois faire un "std::getLine(wfis,...)" ?
    Il existe deux fonctions getline. La première est membre de la classe istream (et dérivées) et travaille sur un tableau de char, la seconde est une fonction libre travaillant sur des std::string. Il vaut donc toujours mieux utiliser la seconde.

  6. #6
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Quel compilo et quel OS utilises-tu ?

  7. #7
    Membre éclairé Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par défaut
    J'utilise Microsoft Visual C++ 6.0, sur windows 2000.

    malheureusement pour des raisons de timing j'ai du (momentanément) prendre la décision d'utiliser les méthodes du C, car il fallait que mon code soit opérationnel immédiatement. Il a semblé (mais je n'ai pas eu le temps d'investiguer plus lomgtemps) que les wiostream fonctionnaient parfaitement, sauf au moment de l'écriture sur le disque. (et donc de la lecture d'un fichier sur le disque) en effet, tant que je restait dans la memoire du proc, tout allait bien, mais dès que j'utilisais des données contenues dans un fichier, alors ça posait des problèmes qui m'ont fait penser que sur le disque, ce n'était pas inscrit en "wide" (mais comme déja dit, j'ai pas pris le temps de vérifier ce que j'avance)

    Je vous remercie en tout les cas de votre aide.

  8. #8
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    On a déjà parlé de ça ici. Il semblerait qu'il soit impossible en C++ standard d'écrire des wchar dans un fichier. Ils sont castés en char.

Discussions similaires

  1. Les fameux caracteres single quote
    Par acheo dans le forum C#
    Réponses: 3
    Dernier message: 11/10/2011, 08h43

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