[C++] Bug lors de la création d'un fichier -> devient unicode

Bug lors de la création d'un fichier -> devient unicode [C++] - C++ - Programmation

Marsh Posté le 11-05-2005 à 11:33:35    

Au boulot, notre soft comporte un module de reporting qui existe depuis la nuit des temps (donc qui a fait ses preuves, donc qui est codé comme dans l'ancien temps).
 
Un bug vient de remonter dessus, et je cherche les causes possibles à ce probleme :
le fichier texte généré sur une base d'un client devient un fichier unicode dans certains cas.
 
Sachant qu'aucune fonction générant de l'unicode n'est appelée (les fonctions utilisées sont fopen, fclose, fputc et fputs), qu'est ce qui peut faire qu'on arrive à un tel cas ?
 
edit : petit oubli.. VC++ 6 sous  Win XP


Message édité par youmoussa le 11-05-2005 à 11:40:03
Reply

Marsh Posté le 11-05-2005 à 11:33:35   

Reply

Marsh Posté le 11-05-2005 à 11:38:19    

Quel OS / compilo ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-05-2005 à 11:40:18    

j'ai édité

Reply

Marsh Posté le 11-05-2005 à 12:02:39    

Ce client il a l'OS en quel langue ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-05-2005 à 12:47:21    

C'est un client anglais, donc je suppose en anglais. On reproduit le bug chez nous avec nos OS en francais.

Reply

Marsh Posté le 11-05-2005 à 13:51:39    

Quelle démarche est suivie pour reproduire le bug ?

Reply

Marsh Posté le 11-05-2005 à 13:55:26    

ben lancer la fonction de report.. le truc strange, c'est qu'en jouant sur les paramètres du report (nombre de périodes à exporter par ex) des fois ca marche, des fois ca marche pas..

Reply

Marsh Posté le 11-05-2005 à 15:23:32    

C'est tout le fichier qui est unicode ? T'écris toujours la même chose ? Tu récupères d'où ce qui est affiché ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-05-2005 à 17:48:58    

Ce n'est pas qqch que je maitrise, mais visiblement, soit un fichier est en unicode soit il ne l'est pas, il ne peut pas l'être à moitié.
 
Qu'entends tu par "écrire la même chose ?"
 
Tout vient de la base

Reply

Marsh Posté le 11-05-2005 à 18:11:36    

C'est quel genre d'info qui vient de ta base ? Tu écris ça comment ?
Ton fichier est ouvert en mode binaire ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-05-2005 à 18:11:36   

Reply

Marsh Posté le 16-05-2005 à 10:21:10    

Bon, j'ai à moitié résolu mon pb..
 
petite démo : ouvrez un notepad (et pas wordpad), tapez dedans la séquence :

70,170,170,170,170,170,170


 
sauvegardez et fermer notepad. Rouvrez le fichier : il l'a converti en unicode/multibytes..
 
pour éviter ce pb, on doit écrire notre fichier en utilisant le mode binaire et non plus texte..

Reply

Marsh Posté le 16-05-2005 à 10:24:25    

Ca ne le fait pas avec un saut de ligne à la fin du fichier.

Reply

Marsh Posté le 16-05-2005 à 10:58:35    

oui, mais ca ne permet pas de corriger le pb (ce n'est pas la seule séquence du fichier qui provoque ca, et ttes les lignes du fichier généré finissent par un retour à la ligne..)

Reply

Marsh Posté le 16-05-2005 à 10:59:16    

enfin, moi ca me troue le cul qd même qu'une pauvre suite de valeur numérique puisse foutre la merde comme ca..

Reply

Marsh Posté le 16-05-2005 à 11:10:14    

et j'oubliais une partie de l'explication : passage de la séquence sur la fonction IsTextUnicode
 
http://msdn.microsoft.com/library/ [...] e_81np.asp
 
Ca renvoie IS_TEXT_UNICODE_STATISTICS, pour lequel il est précisé  
 

Citation :

the IS_TEXT_UNICODE_STATISTICS and IS_TEXT_UNICODE_REVERSE_STATISTICS tests use statistical analysis. These tests are not foolproof. The statistical tests assume certain amounts of variation between low and high bytes in a string, and some ASCII strings can slip through. For example, if lpBuffer points to the ASCII string 0x41, 0x0A, 0x0D, 0x1D (A\n\r^Z), the string passes the IS_TEXT_UNICODE_STATISTICS test, though failure would be preferable.

Reply

Marsh Posté le 16-05-2005 à 14:22:35    

Mouais.
 
Donc en gros, la seule "méthode" valable serait de jouer au chat et à la souris avec l'algorithme de détection, et d'ajouter un truc en début de fichier pour que ce dernier ne fasse pas la conversion. Genre un espace en tout début de fichier, une ligne vide ou je ne sais quoi qui fonctionnerait à tous les coups.
 
Quand même, c'est pas génial. J'aime pas quand ça tient avec des bouts de ficelle...


Message édité par Elmoricq le 16-05-2005 à 14:23:42
Reply

Marsh Posté le 16-05-2005 à 14:40:21    

m'en parle pas... t'es content de débugger un truc pareil.. ca veut surtout dire que les fichiers textes, tu peux pas les écrire en mode texte.. si tu veux être sur, tu dois l'écrire en binaire..

Reply

Marsh Posté le 16-05-2005 à 23:36:56    

Dans ton test c'est notepad qui se vautre à la réouverture du fichier. Il tente d'afficher de l'unicode, mais le fichier reste ANSI, sauf si tu le resauvegardes (car travaillant en unicode).
notepad importe IsTextUnicode, ceci pourrait expliquer cela. Il ouvre le fichier, appelle IsTextUnicode pour savoir si c'est de l'unicode, et adapte l'affichage.
Dans ton cas, je ne vois pas trop en quoi cela te concerne. Chez moi ce programme se comporte correctement:

Code :
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     FILE * file = fopen( "file.txt", "w" );
  5.     fprintf( file, "70,170,170,170,170,170,170" );
  6.     fclose( file );
  7.     file = fopen( "file.txt", "r" );
  8.     char buffer[ 100 ];
  9.     fgets( buffer, sizeof( buffer ), file );
  10.     printf( buffer );
  11.     fclose( file );
  12. }


Par contre notepad affiche n'importe quoi si on ouvre le fichier.
Pour infos:
http://msdn.microsoft.com/library/ [...] _Modes.asp


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Sujets relatifs:

Leave a Replay

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