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 :

Récupérer des accents dans un fichier par getline


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 118
    Par défaut Récupérer des accents dans un fichier par getline
    Bonjour, je fais mes débuts en C++ et j'ai des difficultés à récupérer un texte accentué depuis un fichier.

    Voici le code que je tente de faire fonctionner:
    void IO::lecture(vector <string> & dest)
    {
    string buffer;
    ifstream file(fichier, ios::in); //fichier est défini ailleurs dans le code
    do
    {
    getline(file, buffer);
    dest.push_back(buffer);
    }while(file);
    file.close();
    }
    Ça fonctionne bien pour un texte normale, mais dès qu'il y a un accent, il est remplacé par un code dans buffer.
    J'ai tenté de passer buffer en wstring mais le compilateur me rejette avec ce message sur mon getline:
    erreur: invalid conversion from ‘void*’ to ‘char**’
    erreur: cannot convert ‘std::wstring’ to ‘size_t*’ for argument ‘2’ to ‘__ssize_t getline(char**, size_t*, FILE*)’
    D'ailleurs je sais pas si c'est bien ça qui réglerait le soucis.

    J'ai également tenté de forcer l'internationalisation par
    locale loc("fr_FR");
    Mais j'ai l'impression que mon code a déjà la bonne localisation, même sans ça, si j'en juge par d'autre partie du programme.


    Qu'est-ce qui m'échappe?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 118
    Par défaut
    Au temps pour moi. J'ai bien un problème avec les accents quelque part dans mon programme, et le fait que mon IDE n'affichait pas correctement la valeur de ma variable buffer, j'ai cru que la source de mon problème était mon getline, mais visiblement il fonctionne correctement.

    Je vais continuer à chercher d'où vient le soucis.
    (en fait bien plus loin dans le code, j'ai un isprint qui ne reconnait pas "é" comme un caractère imprimable)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 118
    Par défaut
    Ok, voilà d'où vient réellement mon problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cout << data << endl;	//pour debug
    for(int i=pos; i<data.size(); i++)	
    {	
    	cout << data[i];	//pour debug
    	if( !isprint(data[i]) )
    		return 0;	
    }
    Le résultat donne:
    testé
    test(caractère bizarre)
    Donc c'est l'accès direct au caractère de data qui me cause problème.
    Data est de type string.

    Quelqu'un voit comment je devrais procéder?
    Merci.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 118
    Par défaut
    Pensez vous que passer data en wstring pourrait solutionner mon problème?
    C'est ce que j' essayé mais le compilateur m'a alors rapporté une énorme liste d'erreur.
    Et comme l'affichage de data en tant que string fonctionne correctement lorsqu'il est affiché en un bloc, je ne suis pas sûr que ça va changer quelques chose.
    Alors j'aimerais avoir votre avis avant de revoir l'intégralité de mon programme pour l'adapter en wstring.

    (au cas ou, mon compilateur est gcc)

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par wistiti1234 Voir le message
    Ok, voilà d'où vient réellement mon problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	if( !isprint(data[i]) )
    Tu ne peux pas appeler isquelquechose sur un char, il faut passer un entier ayant la valeur d'un unsigned char ou EOF. Une autre valeur provoque un comportement indéfini.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 118
    Par défaut
    Citation Envoyé par corrector Voir le message
    Tu ne peux pas appeler isquelquechose sur un char, il faut passer un entier ayant la valeur d'un unsigned char ou EOF. Une autre valeur provoque un comportement indéfini.
    Excuse moi d'émettre un doute, mais j'ai trouvé cette fonction sur ce site qui semble avoir été écrit par un professeur en école d'ing.
    D'après son cours cette fonction accepte les char en argument.
    D'ailleurs "if( !isprint('a') )" et "if( !isprint('é') )" ont un comportement parfaitement cohérent chez moi.

    Et je ne suis pas sûr que le problème vient de là puisque "cout << data[i]" pose aussi problème (contrairement cout << data)

    J'aimerais une deuxième confirmation avant de modifier mon isprint.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par wistiti1234 Voir le message
    Excuse moi d'émettre un doute, mais j'ai trouvé cette fonction sur ce site qui semble avoir été écrit par un professeur en école d'ing.
    D'après son cours cette fonction accepte les char en argument.
    Malheureusement beaucoup de personnes baragouinent du C ou du C++, en total amateurisme (dans le mauvais sens du mot - on n'est pas aux J.O.).

    Ce cours est très (très) mauvais, quelques citations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nom     type param      type retour
    acos    double          double
    Non, les fonctions mathématiques sont surchargées pour float, double et long double.
    Le type char représente l'ensemble de tous les caractères imprimables et non imprimables ordonnés selon le code ASCII (chaque caractère est représenté par un entier entre 0 et 127)

    De façon analogue, si C est une variable de type char,
    désigne le code ASCII du caractère C (entier compris entre 0 et 127).
    Ce n'est pas limité à l'ASCII (d'ailleurs ton exemple 'é' n'est pas de l'ASCII).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      cin >> carac;        /* saisie d'un caractere au clavier */
      if (carac == 'A')    /* si c'est un A, alors */
    Aucune validation : et si il y a une erreur de lecture?

    C'est une erreur de débutant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        /* conversion d'une majuscule en minuscule */
        carac = carac + 'a' - 'A';
    Précisément ce qu'il faut éviter de faire. (toupper c'est du poulet?)

    C'est très exactement le genre de code qu'écrivent les amateurs qui ne croient savoir programmer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    long double        calcul financier avec 18 chiffres significatifs
    C'est une blague?

    Bon, j'arrête là, c'est suffisant (et je sature).

    Ce cours => poubelle, sans regrets.
    Citation Envoyé par wistiti1234 Voir le message
    D'ailleurs "if( !isprint('a') )" et "if( !isprint('é') )" ont un comportement parfaitement cohérent chez moi.
    Chez toi, char est signé ou non-signé? S'il est non-signé, cela rejoint ce que je dis.

    De toutes façons, ça ne prouve rien. Un code C++ complètement faux peut marcher pas accident, c'est courant. (Un bon cours de C++ devrait préciser ça.)
    Citation Envoyé par wistiti1234 Voir le message
    Et je ne suis pas sûr que le problème vient de là puisque "cout << data[i]" pose aussi problème (contrairement cout << data)

    J'aimerais une deuxième confirmation avant de modifier mon isprint.
    Peut-être pourrais-tu rechercher cette confirmation par toi-même?

    Peut-être devrais-tu regarder la documentation de la fonction isprint, ou un bon bouquin, ou la norme, ou un brouillon de norme?

    Dans les forums, c'est très possible de trouver deux personnes qui affirment la même contre-vérité, ça ne veut rien dire. Cherches plutôt des sources qui font autorité. Vois toi-même qui raconte quasiment systématiquement n'importe quoi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/04/2007, 14h18
  2. Réponses: 1
    Dernier message: 05/09/2006, 17h56
  3. récupérer des données dans un fichier
    Par pymouse dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2006, 17h43
  4. Réponses: 2
    Dernier message: 16/01/2006, 19h34
  5. Réponses: 1
    Dernier message: 22/12/2005, 15h45

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