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 :

Remplacer une lettre par une autre dans un fichier contenant des caractères Unicode


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut Remplacer une lettre par une autre dans un fichier contenant des caractères Unicode
    Salut j'aimerai savoir comment faire au juste pour remplacer une lettre par une autre dans un fichier contenant des caractères Unicode (caractères wide (wchar_t)).
    J'ai essayer avec le code suivant, mais ça ne marche pas, je tombe a chaque fois dans une boucle infinie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do
    {
       lettre = fgetwc(fichier);
       //printf("%d\n", debug++);
       if( lettre == 'a')
       {
          //puts("OK");
          fseek(fichier, - sizeof(wchar_t), SEEK_CUR);
          fputwc('b', fichier);
       }
    }
    while(lettre != WEOF);
    Le plus bizarre c'est que ftell() retourne 17 avant fseek() et elle retourne 0 après fseek() !
    Merci.

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Quel est l'encodage du fichier? UTF-16? UTF-32?
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Quel est l'encodage du fichier? UTF-16? UTF-32?
    Ben c'est UTF-8 je suppose.
    (Quand je fait "enregistrer sous" avec gedit, ya "Current Locale: UTF-8").

    Remarque à part: le fichier est ouvert avec fopen en mode r+.

  4. #4
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par tomap3
    Ben c'est UTF-8 je suppose.
    Aprés quelques corrections cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do
    {
    	lettre = fgetwc(fichier);
    	printf("%d\n", debug++);
    	if( lettre == L'a')
    	{
    		//puts("OK");
    		fseek(fichier, -1, SEEK_CUR);
    		fputwc(L'b', fichier);
    	}
    }
    while(lettre != WEOF);
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    534
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 534
    Points : 403
    Points
    403
    Par défaut
    Salut,

    Et ça donne quoi pour changer un e en é si le é prend deux octets en utf8 ? Je suppose que fgetwc doit résoudre le problème car ça lit sur deux octets.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Aprés quelques corrections cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    do
    {
    	lettre = fgetwc(fichier);
    	printf("%d\n", debug++);
    	if( lettre == L'a')
    	{
    		//puts("OK");
    		fseek(fichier, -1, SEEK_CUR);
    		fputwc(L'b', fichier);
    	}
    }
    while(lettre != WEOF);
    Pas vraiment !
    Bon pour les caracteres 'a' et 'b' c'est que les exemples ici (c'est vrai que si je les utilise comme ça il faut L'a' pour dire que c'est unicode), mais en fait c'est des caractères Unicode qui sont dans des variables préalables dans mon vrai code... donc bon.
    Pour le 2eme argument de fseek(), il ne fait pas mettre -1. Là je manipule des caractères wide qui ne sont donc pas sur 1 Byte, si tu met -1 ça va reculer d'un seul Byte dans le fichier ce qui provoque un problème (j'ai déjà essayé ça avant sizeof(wchar_t)).
    Donc le problème reste toujours posé.

    Citation Envoyé par dj.motte Voir le message
    Salut,
    Et ça donne quoi pour changer un e en é si le é prend deux octets en utf8 ?
    Heu je ne sais pas, en fait là je manipule des lettres arabes dans le fichier. Le 'a' et 'b' c'était que pour l'exemple dans le code.

  7. #7
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par tomap3
    Pas vraiment !
    Bon pour les caracteres 'a' et 'b' c'est que les exemples ici (c'est vrai que si je les utilise comme ça il faut L'a' pour dire que c'est unicode), mais en fait c'est des caractères Unicode qui sont dans des variables préalables dans mon vrai code... donc bon.
    Désolé de ne pas pouvoir lire dans tes pensées

    Citation Envoyé par tomap3
    Pour le 2eme argument de fseek(), il ne fait pas mettre -1. Là je manipule des caractères wide qui ne sont donc pas sur 1 Byte, si tu met -1 ça va reculer d'un seul Byte dans le fichier ce qui provoque un problème (j'ai déjà essayé ça avant sizeof(wchar_t)).
    Donc le problème reste toujours posé.
    Avant de répondre j'ai souligné le fait que tu utilises un fichier UTF-8, donc oui le 'a' est stocké sur 1 octet (compatibilité avec l'ASCII oblige), le -1 est correcte.

    Sinon moi j'aurais plutôt fait ceci:
    • Ouvrir le fichier en lecture
    • copier ce que je veux dans un autre fichier ouvert en écriture
    • supprimer le fichier précédemment ouvert en lecture
    • renommer le fichier précédemment ouvert en écriture
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  8. #8
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Sinon moi j'aurais plutôt fait ceci:
    • Ouvrir le fichier en lecture
    • copier ce que je veux dans un autre fichier ouvert en écriture
    • supprimer le fichier précédemment ouvert en lecture
    • renommer le fichier précédemment ouvert en écriture
    Pour de l'UTF8, pas moyen de faire autrement.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  9. #9
    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 nicolas.sitbon Voir le message
    Pour de l'UTF8, pas moyen de faire autrement.
    Parce que la longueur est variable, c'est ça ? Certains caractères font 1 octets et d'autres 2, c'est bien ça ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Parce que la longueur est variable, c'est ça ? Certains caractères font 1 octets et d'autres 2, c'est bien ça ?
    C'est bien ça, mais dans tous les cas, je conseille quand même de toujours utiliser la méthode ssmario2.
    "The quieter you become, the more you are able to hear"
    "Plus vous êtes silencieux, plus vous êtes capable d'entendre"

  11. #11
    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 nicolas.sitbon Voir le message
    C'est bien ça, mais dans tous les cas, je conseille quand même de toujours utiliser la méthode ssmario2.
    Oui, moi aussi... Les écritures dans le fichier existant (modes "*+"), je n'y crois pas...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 21
    Points : 17
    Points
    17
    Par défaut
    Ok je ferai comme ça alors.
    Meci.

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

Discussions similaires

  1. Remplacer une lettre par une autre dans une cellule
    Par Philippe76 dans le forum Excel
    Réponses: 1
    Dernier message: 09/01/2010, 21h26
  2. Remplacer un texte par un autre dans un fichier
    Par Fredo67 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 08/04/2009, 16h04
  3. SQL Remplacement d'une lettre par une autre
    Par nathieb dans le forum SQL
    Réponses: 2
    Dernier message: 19/09/2007, 11h01
  4. comment remplacer un caractere par un autre dans un fichier txt
    Par uzumaki_naruto dans le forum Langage
    Réponses: 6
    Dernier message: 24/07/2006, 13h33
  5. Remplacer un mot par un autre dans un fichier
    Par vbcasimir dans le forum Linux
    Réponses: 8
    Dernier message: 25/04/2006, 12h08

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