begin process at 2012 05 29 00:42:38
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Base de données

 > 

comment faire pour lire un fichier contenant des caractères Unicode ?


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

comment faire pour lire un fichier contenant des caractères Unicode ?

mardi 4 octobre 2005 à 11:13:42 | comment faire pour lire un fichier contenant des caractères Unicode ?

michelcreve

- J'essai de faire un Utilitaire de reformatage d'un fichier lu en entrée et création d'un autre fichier en sortie.
- Le programme demande le chemin daccès du fichier en entrée
  la longueur des enregistrements en sortie
  et éventuellement si on veut tronquer ou faire un retour a la ligne

Le problème que j'ai, c'est que lorsque je lis des fichiers en provenance de Windows NT, toutes les caractères 'é' 'è' 'à', unicode etc.. sont ignorés et ne sont pas repris alors que les fichiers venant de XP c'est OK  ??.

Je pense que le problème se situe dans la fonction de lecture
recopié ci-dessous :    

  FileStream* fw = new FileStream(path, FileMode::Open); // ouverture fichier
  StreamReader* sr = new StreamReader(fw);

Il faut surement compléter,remplacer cette fonction de lecture, mais ??
  String* line  = sr->ReadLine();  //lecture ligne du fichier

Merci d'avance pour ceux qui peuvent m'aider
Michel (le mari de la belle cicilienne)


pour ceux qui veulent tester mon programme , voici mon code source :

-------------------------
// This is the main project file for VC++ application project
// generated using an Application Wizard.

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;
using namespace System::IO;
using namespace System::Text;


#include <valarray>
#include <Cstring>
#include <iostream>

#include <io.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// This is the entry point for this application
#ifdef _UNICODE
int wmain(int argc, wchar_t *argv[], wchar_t *envp[] )
//int wmain(void)
#else
int main(int argc, char* argv[])
#endif

{
   using namespace std;
String* path = new String(argv[1]);
int longueur = 0;

string line2 ("");
char respons = ' ' ;

//Console::Write("Valeur de argc = ");
//Console::WriteLine(argc);
//Console::WriteLine(argv[1]);
//Console::WriteLine(argv[2]);

if (argc < 2) // Verifie si on a passé le 1er parametre
    {
        Console::WriteLine(S" ----------------------------------------------");
  Console::WriteLine(S" Veuillez entrer le chemin et nom de fichier : ");
  Console::WriteLine(S" ----------------------------------------------");
  path = Console::ReadLine();
    }
if (argc == 3) // Verifie si on a passé le 2eme parametre
    {longueur = atoi(argv[2]);
}
if (longueur == 0) // Verifie si on a passé la longueur
    {
  Console::WriteLine(S" ----------------------------------------------------");
  Console::WriteLine(S" Veuillez entrer la longueur de chaque record desiré ");
  Console::WriteLine(S" ----------------------------------------------------");
  longueur = Console::ReadLine()->ToInt16(0);
  
    }
if (!File::Exists(path)) // Verifie si le fichier existe
    {
        Console::WriteLine(S" --------------------------------------");
  Console::WriteLine(S" Fichier ou chemin d'accès incorrect ! ");
  Console::WriteLine(S" --------------------------------------");
  Console::WriteLine(path);
  Console::WriteLine(S" --------------------------------------");
  cin.ignore();
  return -1;
    }
try
    {
   // Create a FileStream
        String* path2 = S"D:\\data\\MyTest2.out";
   //FileStream* fs = new FileStream("d:\\data\\output.txt", FileMode::Create);
   // Create a StreamWriter
  StreamWriter* sw = new StreamWriter(path2, false, new UnicodeEncoding());
  //StreamWriter* sw = new StreamWriter(fs); topé 09sept
  
  FileStream* fw = new FileStream(path, FileMode::Open);
        StreamReader* sr = new StreamReader(fw);
  int count = 0;

  Console::WriteLine(S" --------------------------------------");
  Console::Write(S"longueur d'enregistrement demandé : ");
  Console::WriteLine(longueur);
  Console::WriteLine(S" --------------------------------------");
  
  for(;;) // Lecture des enregistrements
  //-----------------------------------------------
  {
      String* line  = sr->ReadLine();
            count++;
            
   // If there are no more lines, break out of the loop
            if (line == 0) break;
  
   if (longueur > 0 )
   {
    //test si l'enregistrement > a la taille demandée
    //-----------------------------------------------
    
    if (line->get_Length() < longueur )
    {   if (line->get_Length() == 1 && toascii(line->ToChar(0)) == 26) break; // si fin de fichier
     //Console::Write("enreg < longueur : ");
     //Console::WriteLine(toascii(line->ToChar(0)));
     //Console::WriteLine(line); //Affiche a l'écran
     line2.resize(longueur-(line->get_Length()) ,'0'); //complete la ligne avec des zéro
     sw->Write(line);
     sw->WriteLine(line2.data());
    }
    else
    { if (respons == ' ')
      {
     Console::WriteLine(S"--------------------------------------------------------");
     Console::WriteLine(S"Longueur d'enregistrement detecte > à taille demandé ?  ");
     Console::WriteLine(S"Voulez vous ajouter le surplus à la ligne suivante (O/N)");
     Console::WriteLine(S" -------------------------------------------------------");
     String* response = Console::ReadLine();
     respons = response->ToChar(0) ;
     }
     if (respons == 'O' || respons == 'o')
     { do
      { sw->WriteLine(line->Substring(0,longueur));
       line = line->Substring(longueur);
      }
      while (line->get_Length() >= longueur);
      if (line->get_Length() > 0)
      { line2.resize(longueur-(line->get_Length()) ,' ');
       sw->Write(line);
       sw->WriteLine(line2.data());
      }
     }
     else
     {
      sw->WriteLine(line->Substring(0,longueur));
     }  
    }
    //-----------------------------------------------    
  
   }
   //-----------------------------------------------
  
   else
   {
    sw->WriteLine(line);
   }
   //if (count % 20 == 0)  // Pause toutes les 20 lignes
            //{
            //    Console::Write("--more--");
            //    String* response = Console::ReadLine();
            //    if (response->Equals(S"q")) break;
            //    count = 0;
            //}
        } //fin FOR
  

        sw->Flush();
        sw->Close();
    }
    catch(System::Exception* pe)
    {
        Console::WriteLine(pe->ToString());
    }

//cin.ignore();
    return 0;
}

--------------------
Fichier d'entête stdafx.h (ne contenant que du commentaire)
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
--------------------
mercredi 12 octobre 2005 à 10:56:10 | Re : comment faire pour lire un fichier contenant des caractères Unicode ?

michelcreve

J'ai trouvé,

Il suffit d'utiliser l'Encoding::UTF7.

Reste qu'il faut maintenant résoudre le problème suivant :
Lorsque je lance mon programme d'un disque local C:\ D:\ ca marche
mais pas quand c'est via un disque réseau ?

il met une erreur de Sécurity policy. Je vais donc investiguer les autorisations avec l'outils Permview.exe.


Cette discussion est classée dans : include, console, line, longueur, writeline


Répondre à ce message

Sujets en rapport avec ce message

adaptation code console vers MFC [ par gege1024 ] voila, j'ai un code qui prend des parametres donnés par des ligne de commande, mais je voudrais l'adapter pour en faire une interface graphique.j'ai r ios::eof [ par ssmint ] Bonsoir,mon dernier petit souci en date en matière de C++, est la fonction eof(). Voici le code : #include &lt NEED HELP VISUAL STUDIO & .exe [question simple enfin je crois...] [ par starkrous ] voila j'ai visual studio j'ai mon .cpp quand je crée un .exe pas de probleme ça marche nikel, sauf que je me suis rendu compte que ce .exe ne marchait #Include<...> dans Visual C# 2010 [ par Nairos ] Bonjour, Pris d'une soudaine envie à la reconversation dans le langage C, plus précisément en console, je commence par les bases. A savoir, afficher u getpixel() en mode console ?? [ par kirby94460 ] Bonjour j'utilise dev c++ en mode console et en mode C(nn pas C++) voici mon code :#include #include #include #include <br Probleme de lecture XML [ par jojomillenium ] Bonjour, (C++.NET form application sous VS2003) J'aimerai pouvoir lire un fichier XML seulment je n y arrive pas, j ai trouver plusieurs exemple sur l problème de point vérgulle? [ par awalle ] voilà mon code! #include #include #include int main() { double v,h,a,b,x; h=(b-a)/6; printf("doner a\n"); plus court chement avec le cout [ par developvbdebut ] Bonsoir tout le mondeJ'ai un probleme avec l'algo du plus cours chemin, je ne vois pas comment mis prendre. De plus, je dois affichier la distance e pb conversion CString string pour affichage ds combobox [ par phenix6942 ] bonjour à tousje realise un projet mfc dans lequel j utilise plusieurs boites de dialogue.dans une de ces boites je souhaite afficher des string dans icon pour une application console? [ par Slown ] Bonjour, je voudrais savoir comment on fait pour avoir une icon, créée avec VC++, pour une application console. Je n'ai trouvais que des tutz pour les


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,218 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales