Remplacer une lettre wchar_t par une autre dans un fichier. (Unicode)

Remplacer une lettre wchar_t par une autre dans un fichier. (Unicode) - C - Programmation

Marsh Posté le 05-04-2009 à 14:06:10    

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 :
  1. do
  2. {
  3.    lettre = fgetwc(fichier);
  4.    //printf("%d\n", debug++);
  5.    if( lettre == 'a')
  6.    {
  7.       //puts("OK" );
  8.       fseek(fichier, - sizeof(wchar_t), SEEK_CUR);
  9.       fputwc('b', fichier);
  10.    }
  11. }
  12. while(lettre != WEOF);


Le plus bizarre c'est que ftell() retourne 17 avant fseek() et elle retourne 0 après fseek() !
Merci.

Reply

Marsh Posté le 05-04-2009 à 14:06:10   

Reply

Marsh Posté le 07-04-2009 à 22:31:39    

if( lettre == 'a')
 
J'ai un doute, là. lettre étant un wchar_t, m'étonnerait que ça puisse être égal à un char.


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 07-04-2009 à 23:16:54    

Ouais effectivement sizeof (wchar_t) est dépendant du système. Sur Mac OS X, ça vaut 4, sur Windows ça vaut 2.
 
Windows utilise de l'UTF-16, qui vient en deux versions : Big endian et little endian. Cela dit, si le fichier est créé et lu sur la même machine, ça devrait aller.
 
Bref, faut faire attention à ce que tu lis. Mets un printf pour voir si c'est bien le code ascii du 'a' que tu récupères et pas une valeur déformée par l'endianess.
 
C'est pour ça que je préfère l'UTF-8, pas besoin de ce prendre la tête avec ce genre de détails.

Reply

Marsh Posté le 08-04-2009 à 08:49:58    

tomap a écrit :

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)).


 
On est parti pour un des sujets techniques les moins bien maitrises par le
programmeur median...
 
1/ wchar_t ce n'est pas necessairement de l'Unicode.
 
2/ que tu le lises comme une suite de caracteres etroits ou larges, un
fichier a un encodage multibyte qui depend de la locale; donc deux
caracteres differents peuvent occuper une place differente dans le fichier,
donc la seule solution portable est de copier en faisant la transformation
que tu desires, puis effacer le fichier original (ou le renommer), puis
renommer le fichier dans lequel tu as copie.
 
3/ s'il est envisagable d'avoir des locales qui utilisent des encodages non
variables, je n'en connais pas: les locales que je connais qui utilisent
unicode pour wchar_t utilisent UTF-8 comme encodage.
 

Citation :


Code :
  1. fseek(fichier, - sizeof(wchar_t), SEEK_CUR);



 
1/ Dans un fichier texte, on ne peut de maniere portable faire des
deplacements que vers des positions retournees precedemment.
 
2/ sizeof(wchar_t) est une constante a la compilation; meme si tu as une
locale qui utilise un encodage de taille fixe, il n'y a a priori aucun
rapport entre cette taille et sizeof(wchar_t).
 

el muchacho a écrit :

if( lettre == 'a')
 
J'ai un doute, là. lettre étant un wchar_t, m'étonnerait que ça puisse être égal à un char.


 
On est en C.  'a' est de type int (en C++ 'a' est de type char).
 
De plus 'x' == L'x' sauf si __STDC_BTOWC_NEQ_WCTOB__ est defini ou qu'on a
un systeme (d'office non POSIX) qui implemente la solution de DR279 mais
pas de DR321.
 
 

tpierron a écrit :

Ouais effectivement sizeof (wchar_t) est
dépendant du système. Sur Mac OS X, ça vaut 4, sur Windows ça vaut 2.
 
Windows utilise de l'UTF-16, qui vient en deux versions : Big endian et
little endian. Cela dit, si le fichier est créé et lu sur la même machine,
ça devrait aller.


 
Est-tu sur que les locales Windows utilise UTF-16 sur disque et pas UTF-8?
(Je ne programme pas sous Windows; et je l'utilise tres peu.  Mais je sais
que Windows utilise UTF-16 en memoire pour wchar_t; ce qui ne me semble pas
conforme, un wchar_t devant etre capable de representer n'importe quel
caractere).

Reply

Marsh Posté le 10-04-2009 à 17:50:01    

Je compile sous Linux, ma locale est en UTF-8, et les caractères que je manipule sont en fait des caractères arabes. le 'a' et le 'b' ( ou disant L'a' et L'b' ) c'était juste pour l'exemple.
Donc à ce que je vois, vu que en UTF-8 la longueur est variable d'un caractère à un autre , la seule manière de faire ça sans problème est de copier lettre par lettre dans un autre fichier, puis le renommer..


Message édité par tomap le 10-04-2009 à 17:52:00
Reply

Marsh Posté le 10-04-2009 à 20:51:23    

Exact.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed