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 :

Lecture fichier : fgets et accents...


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Lecture fichier : fgets et accents...
    Bonjour
    J'ai un petit problème fgets ne détecte pas les caractères accentués...
    Comment pourrai-je procèder ??
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Leture fichier : fgets et accents...
    Citation Envoyé par Force_Rouge
    Bonjour
    J'ai un petit problème fgets ne détecte pas les caractères accentués...
    Comment pourrai-je procèder ??
    Merci
    fgets() n'a rien à voir. Poste ton code.
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Sachant que pour le moment je fais des tests le code n'est pas tres impressionnant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[1]={0};
     
    fgets (car ,2, pf);
    printf("%s",car);
    :-/

  4. #4
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par Force_Rouge
    Sachant que pour le moment je fais des tests le code n'est pas tres impressionnant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[1]={0};
     
    fgets (car ,2, pf);
    printf("%s",car);
    :-/
    Tu n'alloues pas assez de place pour ton tableau car... Où veux-tu qu'il stocke le '\0' de fin de chaîne?

    En plus tu donnes 2 comme taille du tableau à fgets!!

    Il faudrait mieux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[16]={0};
     
    fgets (car ,sizeof car, pf);
    printf("%s",car);
    Cela éviterait des problèmes...
    Jc

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    hmmm...oui je suis con...
    mais je fais une lecture car par car pour pourvoir filtrer la ponctuation donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[2]={0};
     
    fgets (car ,sizeof car, pf);
    printf("%s",car);
    Mais cela ne règle pas mon problème d'accents :'(

  6. #6
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par Force_Rouge
    hmmm...oui je suis con...
    mais je fais une lecture car par car pour pourvoir filtrer la ponctuation donc:
    Utilise fgetc alors.
    Si tu veux filtrer la ponctuation tu peux utiliser strtok.

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Force_Rouge
    Sachant que pour le moment je fais des tests le code n'est pas tres impressionnant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[1]={0};
     
    fgets (car ,2, pf);
    printf("%s",car);
    :-/
    Non, mais suffit pour écrire des bétises....

    Il ne faut pas mentir à ton compilateur. car accepte 1 char et tu dis à fgets() qu'il peut en accepter 2 ! Le comportement est indéfini.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[80];
     
    fgets (car ,sizeof car, pf);
    printf("%s",car);
    et n'oublie pas de fournir <stdio.h> et que fgets() prend le '\n' quand il y a la place.

    http://emmanuel-delahaye.developpez....tes.htm#saisie
    http://emmanuel-delahaye.developpez....s.htm#fichiers
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Force_Rouge
    mais je fais une lecture car par car pour pourvoir filtrer la ponctuation donc:
    La bonne fonction est donc fgetc()...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char car[2]={0};
     
    fgets (car ,sizeof car, pf);
    printf("%s",car);
    Mais cela ne règle pas mon problème d'accents :'(
    Si problème d'accents il y a, il ne vient pas de fgets() qui n'y peut rien, mais du système, qui, lorsqu'on lui envoit (par printf) une certaine valeur (lue dans le fichier) affiche un glyphe qui ne correspond pas aux attentes, tout simplement par ce que le charset n'est pas pas le même. Typiquement, tu as de l'ANSI dans le fichier et tu affiche avec la console de Windows qui est par défaut en OEM...

    (Il y a des noms plus savants que ANSI et OEM)
    Pas de Wi-Fi à la maison : CPL

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    sachant que je programme sous linux :s

  10. #10
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Sous linux tout devrait être dans le charset utilisé par la locale.
    Tape echo $LANG dans un terminal pour savoir ce que c'est.
    Boost ftw

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Cet encodage : fr_FR.UTF-8

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Force_Rouge
    Cet encodage : fr_FR.UTF-8
    Maintenant, il faut savoir quel charset a été utilisé pour créer le fichier...
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je pense le même j'ai juste fait créé un nouveau texte dans gedit o__O

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Je ne suis pas sûr qu'un programme en C gère forcément bien l'UTF-8 : Il lui faut plusieurs caractères pour une seule lettre accentuée. Ensuite, à supposer que le terminal supporte lui aussi l'UTF-8 (je ne pensais même pas que cela était possible), il faut bien envoyer la séquence de caractères dans le même ordre qu'on l'a lue...
    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.

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Dans ton cas, fgetc lit un octet et en utf-8 les caractères sont multi-octets.
    Il faut donc faire attention.
    Boost ftw

  16. #16
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    [C99]wprintf permet d'afficher les caractères étendus, enfin si ton compilateur l'implémente correctement, si tu utilise gcc c'est pas gagné

  17. #17
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    enfin si ton compilateur l'implémente correctement, si tu utilise gcc c'est pas gagné
    !!!???
    Boost ftw

  18. #18
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par loufoque
    enfin si ton compilateur l'implémente correctement, si tu utilise gcc c'est pas gagné
    !!!???
    http://www.developpez.net/forums/viewtopic.php?t=445548
    http://gcc.gnu.org/c99status.html

    ça répond à tes interrogations ?

  19. #19
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Oui enfin ça marche très bien, c'est juste qu'on peut pas saisir des caractères non ASCII avec L'' ou L"", ce qui est facilement explicable étant donné que pour ça il faudrait faire une conversion depuis l'utf-8 vers UCS-2 ou UCS-4, en partant du principe que les caractères larges servent pour Unicode.

    En tous cas ce n'est nullement un problème et de toutes façons les caractères larges ça a vraiment peu d'intérêt.
    D'ailleurs y'a qu'en programmation windows que c'est vraiment utilisé.
    Boost ftw

  20. #20
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Bon j'ai trouvé l'erreur en fait mais je trouve que c'est quand même bizarre...
    J'avais un premier fgets dans mon code qui me servait a faire une première lecture...c'est ce fgets qui ne "marchait" pas mais dès que je le met dans une boucle (while(!feof(pf))) ça marche à merveille...même les accents...
    -_-'

    Merci à vous tous pour votre aide

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

Discussions similaires

  1. segfault fgets() lecture fichier
    Par dharth dans le forum C
    Réponses: 2
    Dernier message: 25/09/2011, 18h18
  2. Problème accent lecture fichier texte
    Par brisso dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2011, 19h46
  3. Réponses: 3
    Dernier message: 28/11/2010, 19h56
  4. Lecture fichier en UTF8 / problème d'accent
    Par nyoshi dans le forum Qt
    Réponses: 1
    Dernier message: 22/08/2008, 12h11
  5. Lecture ligne par ligne d'un fichier - fgets
    Par raphadw dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 22/01/2008, 21h45

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