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 :

lire un fichier en Unicode=prob


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut lire un fichier en Unicode=prob
    Bonjour, voila je suis actuellement en train de travailler a un petit logiciel devant lire des informations assez particulieres codees en ASCII si bien que l'orsque je les lits avec les operateurs de bases en j'ai l'impression que de l'informations se pert ou sinon tout simplement le programme plante. Donc je me demandait si quelqu'un soit, aurrais une solution a mon probleme soit pourrais m'expliquer comment modifier les operateurs basiques de lectures dans un fichier de maniere a avoir l'affichage ou l'acquisition en unicode,sans traduction faite par ces derniers.
    Merci d'avance
    je ne sais pas si je suis tres clair, n'hesitez pas a me demander des precisions.

  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
    Qu'appelles-tu "les opérateurs de base" ?
    Les fonctions de lecture texte et les opérateur d'extraction des flux C++ ?
    Lors que je les avais essayés, ils ne supportaient carrément pas l'unicode (un wofstream écrivait dans un fichier texte ASCII). À moins, ce qui est tout à fait possible vu mon niveau avec les streams, que je me sois complètement gouré quelque part, je pense que tu ferais mieux de lire directement en binaire pour ce genre de choses...
    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
    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
    Si les données sont en ASCII, inutile de passer par Unicode.

    Ton problème n'est pas très clair, essaye de préciser en postant un exemple de code et/ou de données.

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Qu'appelles-tu "les opérateurs de base" ?
    Les fonctions de lecture texte et les opérateur d'extraction des flux C++ ?
    Lors que je les avais essayés, ils ne supportaient carrément pas l'unicode (un wofstream écrivait dans un fichier texte ASCII). À moins, ce qui est tout à fait possible vu mon niveau avec les streams, que je me sois complètement gouré quelque part, je pense que tu ferais mieux de lire directement en binaire pour ce genre de choses...
    Si on veut jouer avec unicode, il faut utiliser une locale adéquate. Un exemple qui montre ce qui se passe quand on utilise les locale et quand on ne les utilise pas.
    Code X : 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
    $ cat testunicode.cpp
    #include <fstream>
    #include <iostream>
    #include <locale>
    #include <iomanip>
    
    int main()
    {
    #ifndef NO_LOCALE    
        std::locale::global(std::locale(""));
    #endif    
        std::cout << std::locale().name() << std::endl;
        std::wifstream f("unicode.data");
        wchar_t ch;
        std::cout << std::setbase(16);
        while (f.get(ch)) {
            std::cout << " " << ch;
        }
        f.close();
        std::cout << '\n';
        std::wofstream g("unicode.res");
        g << L"\xE1\n";
        g.close();
        return 0;
    }
    $ od -t x1 unicode.data
    0000000 c3 a1 0a
    0000003
    $ CC -DNO_LOCALE testunicode.cpp 
    $ env LC_ALL=en_US.UTF-8 ./a.out
    C
     c3 a1 a
    $ od -t x1 unicode.res
    0000000 e1 0a
    0000002
    $ CC testunicode.cpp
    $ env LC_ALL=en_US.UTF-8 ./a.out
    en_US.UTF-8
     e1 a
    $ od -t x1 unicode.res
    0000000 c3 a1 0a
    0000003
    C'est plus compliqué si on n'a pas de locale adéquate; il faut définir une facet soi-même.

  5. #5
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Ok merci deja pour ces premiere reponses, par contre je doit avouer que je n'ai carrement rien compris aux "locales". Il va falloir que je potasse un petit peu le sujet.
    Les operateur de bases pour moi sont juste l'operateur >> ainsi que peut etre get();open() dont je ne connais pas correctement les particularites.
    Les dossiers que je doit ouvrir sont de type .edf ou .edf+ c'est un format destine aux enregistrement medicaux qui consiste en une premiere partie contenant des informations sur l'enregistrement puis l'enregistrement en soi.
    Voici un exemple (ou la premiere partie est simplifie) :

    1ere partie

    8 bits :nom du patient
    8 bits :heure de l'enregistrement
    4 bits : nombre de channels sur l'emregistrement, N
    4 bits : duree en seconde de chaque echantillon
    N*8bits : info sur les different procedee d'enregistrement

    2eme partie

    (1ere seq du 1er enregistrement)
    entier

    (1ere seq du deux enregistr.)
    entier

    (2eme seq du 1er)
    entier

    ..

    il existe aussi la version edf+ ou l'on peut mettre des annotations au lieu de simples entiers, ou les ponctuations sont le 20 note* , le 21 note \ et le 0 note# de l'alphabet ascii

    +0 ** debut de l'enregistrement *#
    +0 \ 660* duree du sommeil*#
    +120*lumiere eteinte*#
    (explication)
    +temps en seconde apres l'origine temporelle \ duree seconde*annotation*#

    en bref la comprehension du language ne vous interesse pas trop mais vous comprennez pourquoi il me faut necessairement traduire correctement ce language.

    Je pense que effecteivement il serat probablement plus imple de lire en binaire directement, pourriez vous pour cela m'indiquer ou trouver des information pour une telle tache car mes connaissances en programmations sont assez faible.
    Merci d'avance

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Pour les locales, ne t'inquiète pas, peu de monde a l'air de les comprendre.

    Pour une lecture en binaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::ifstream s("fichier", std::ios_base::binary);
    s.imbue(std::locale::classic());
    s.rdbuf()->sgetn()
    8 bits pour stocker un nom, ça me semble peu.

  7. #7
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Pour les locales, ne t'inquiète pas, peu de monde a l'air de les comprendre.
    Je dirais : peu de monde les comprend. (moi le premier, je ne suis pas une superstar : les locales, ça peut aller, mais les facets... ).

  8. #8
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Yes super merci beucoup. Pour ce code meme si il me faut maintenant comprendre comment mesurer la longueur de la lecture, et surtout comment retraduire le texte en ascii c'est deja tres bien.
    ( les 8 bits c'etait pour l'exemple)
    Donc merci beaucoup.

  9. #9
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    En fait j'ai ete un peu vite a repondre car ces lignes de codes je ne les aient pas comprises et de surcroit la derniere provoque une erreure de type appel illegal.
    Pourriez vous donc me donner un exemple de lecture en binaire puis de traduction "manuelle" du code pour l'afficher ensuite.
    merci

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Tu prends ta doc et tu cherches streambuf::sgetn dedans. Si après tu ne comprends pas, tu peux poser des questions.

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Merci car a vrai dire j'ai pas de doc je suis actuellemnet en russie et je sais franchement pas a qui la demander

  12. #12
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Le lien que j'ai donne ne marche pas en Russie?

  13. #13
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Сomme je disait je n'ai pas compris la procedure donc je suis aller chercher dans la doc et la fonction sgetn a ete remplacee per Sgetn_s (question de securite) qui considere plus d'element en entree( buffer d'entre,taille du buffer de sortie ,la quantite a lire et retourne le nombre d'element lu.
    Dons je comprends que d'abord tu ouvre en binaire le fichier
    puis tu choisi la locale classique
    et enfin alors moi je comprend que tu verifie la quantite lue avec la derniere ligne
    est ce bien cela?

    Quoi qu'il en soit, lorsque l'info est lue en binaire, celle ci est encore inutilisable. Donc il faut que je traduise chaques portions de code.
    Et pour cela, j'aimerais definir des objet du genre LETRRE_ASCII pour pouvoir ensuite assigner des valeur binaires a des objets de ce type predefinie, de la meme maniere que l'on definie le type couleur et que l'on fixe la couleur bleu a la valeur [0,0,128].
    Je pense qu'ainsi il me sera facil de faire une fonction traductrice.
    Qu'en penser vous et savez comment proceder?
    merci

  14. #14
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par aptyp
    Сomme je disait je n'ai pas compris la procedure donc je suis aller chercher dans la doc et la fonction sgetn a ete remplacee per Sgetn_s (question de securite) qui considere plus d'element en entree( buffer d'entre,taille du buffer de sortie ,la quantite a lire et retourne le nombre d'element lu.
    Tu peux me donner l'endroit exact ou tu as lu ca? Je ne trouve pas Sgetn_s avec google.

    Dons je comprends que d'abord tu ouvre en binaire le fichier
    puis tu choisi la locale classique
    et enfin alors moi je comprend que tu verifie la quantite lue avec la derniere ligne
    est ce bien cela?
    Oui.

    Quoi qu'il en soit, lorsque l'info est lue en binaire, celle ci est encore inutilisable. Donc il faut que je traduise chaques portions de code.
    Et pour cela, j'aimerais definir des objet du genre LETRRE_ASCII pour pouvoir ensuite assigner des valeur binaires a des objets de ce type predefinie, de la meme maniere que l'on definie le type couleur et que l'on fixe la couleur bleu a la valeur [0,0,128].
    Je pense qu'ainsi il me sera facil de faire une fonction traductrice.
    Qu'en penser vous et savez comment proceder?
    merci
    Je ne comprends pas ce que tu veux dire. Il te faut ecrire des fonctions pour encoder et decoder tes donnees en fonction du format qui t'est impose/que tu choisis.

  15. #15
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Alors la fonction je l'ai trouver via visual c++ avec la recherche en tapant ce que tu m'a dit de taper a savoir streambuf::stgn et je suis tomber dans un chapitre du genre fonctions securisees de la stl.

    Quant a ce que je doit faire avec l'information c'est tout simplement de l'afficher via un microprocesseur et un petit ecran externe. Pour cela il me faut recuperer l'information puis la traduire en grandeur reelle et enfin l'envoyer vers la partie affichage.

    Mais en fait en tappant ces lignes, je me rend compte qu'il me suffit de generer un tableau contenant les 00->FF puis faire une simple procedure de recherche pour identifier le n-ieme caractere de l'ASCII. Cependant l'assignement de valeur par exemple
    {
    if(00) charactere=null
    else{if(01)character=lambda...
    }}}}}
    risque d'etre lourd

    tandis que quelque chose du genre pourrait etre plus simple

    #define ascii_null 0000
    #define ascii_lambda 0001
    ...
    associer avec une fonction extrayant la partie finale de ascii_finale et le transformant en type char ou meme quitte a perde de l'espace mais gagner en comprension en chaine cela me permettrait de bien comprendre la structure et surtout de bien verifier le fonctionnement de mon programme.
    suis-je plus clair?

  16. #16
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par aptyp
    Alors la fonction je l'ai trouver via visual c++ avec la recherche en tapant ce que tu m'a dit de taper a savoir streambuf::stgn et je suis tomber dans un chapitre du genre fonctions securisees de la stl.
    Qu'est-ce qu'ils ont encore ete inventer? Sgetn_s n'est pas quelque chose d'officiel ni meme a ma connaissance n'est present dans les propositions en cours.

    suis-je plus clair?
    Non. Si tu as un tableau te donnant le mapping desire, je ne vois pas la necessite de chainer des if.

  17. #17
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Non. Si tu as un tableau te donnant le mapping desire, je ne vois pas la necessite de chainer des if.[/QUOTE]

    pourrais tu me preciser la maniere d'eviter ces ifs car il me faut bien passer du binaire a l'hexa( c facil) puis a l'indice du tableau et enfin au caractere
    (peut etre la reponse a ma question est a l'interieur)

    Sinon pour ce qui est des trois lignes pour la lecture binaire je les aient ecrite de la maniere suivante et la compilation me retourne
    segmentation fault (je sais ce que cela signifie)

    char*a;

    std::ifstream s("fichier", std::ios_base::binary);
    s.imbue(std::locale::classic());
    s.rdbuf()->sgetn(a,1);

    pourriez vous m'expliquer car je doit avouer que si j'ai compris la globalite les detail m'echappe et il m'est donc difficil de comprendre l'erreur.
    merci

  18. #18
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    Qu'est-ce qu'ils ont encore ete inventer? Sgetn_s n'est pas quelque chose d'officiel ni meme a ma connaissance n'est present dans les propositions en cours.
    Ce n'est pas leur seul truc de ce genre : Par exemple, utiliser std::copy provoque un warning avec les options par défaut.

    Ou définir un autre char_trait pour std::sting. Et dans ce cas, chose amusante, on a beau désactiver ce warning, il s'affiche toujours. Le seul moyen que j'ai eu pour le supprimer a été d'ajouté un typedef à la noix dans mon char_trait, typedef que j'ai trouvé en décortiquant l'implémentation des basic_strings par défaut.

    Qu'ils fassent des vérifications de débordement en mode débug, je n'ai rien contre, bien au contraire. Qu'ils t'incitent à ne pas utiliser des fonctions standard (avec des messages tels que "std::copy has been deprecated"), là, je trouve qu'ils poussent le bouchon...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  19. #19
    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
    +INT_MAX.
    Le pire je trouve, c'est qu'il nous ont fait une nouvelle fonction du type snprintf() au lieu de nous sortir ENFIN la vraie fonction snprintf() du C99...
    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.

  20. #20
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 10
    Par défaut
    Bon voila en fait je crois pouvoir mieu precicer l'endroit ou je bloque.
    C'est au niveau de la fontion traductrice je ne sais pas comment je doit la specifier le fait d'avoir l'information en binaire me trouble.
    Dite moi si je me trompe.
    La consigne binary ouvre mon fichier en binaire.
    donc les informations sont sous la forme 0 1 etc et a lire par byte par byte.
    Ici je suis completement bloquer. D'une part parce que je ne sais pas comment conciderer ces bytes et d'autre part je ne sais quel type donner a ces byte (probablement char). Et d'autre part lorsque je vais appeler ma fonction traduire qu'aura t-elle en entree, une valeur binaire ou bien directement le charactere ascii au quel cas mon travail aura ete inutil ?!

Discussions similaires

  1. Lire gros fichier en Unicode: UniHan
    Par Pierebean dans le forum MATLAB
    Réponses: 1
    Dernier message: 26/01/2013, 17h44
  2. lire un fichier unicode
    Par Couanais Pierre dans le forum Débutez
    Réponses: 2
    Dernier message: 02/09/2011, 16h18
  3. Lire (et convertir) un fichier en unicode/utf-16
    Par sopsag dans le forum Général Python
    Réponses: 2
    Dernier message: 10/06/2009, 12h58
  4. lire un fichier en unicode
    Par kha_yassine dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 20/06/2007, 18h13
  5. Lire un fichier encodé en UNICODE
    Par loman02 dans le forum XML
    Réponses: 9
    Dernier message: 16/02/2007, 18h19

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