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

michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006 - 4 oct. 2005 à 11:13
michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006 - 12 oct. 2005 à 10:56
- 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

#include
#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
//
--------------------

1 réponse

michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006
12 oct. 2005 à 10:56
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.
0
Rejoignez-nous