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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 42
    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... ).

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