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 - 30 sept. 2005 à 17:29
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 - 30 sept. 2005 à 21:02
- 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 le code recopié cidessous (en rouge):
Il faut surement utiliser autre code, mais lequel ?
FileStream* fw = new FileStream(path, FileMode::Open);
StreamReader* sr = new StreamReader(fw);

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


Voici mon 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;
}

3 réponses

michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006
30 sept. 2005 à 17:42
PS : Joubliais, si vous avez un code erreur sur le fichier entête stdafx.h, il suffit de
Créer le fichier avec des commentaires genre :

Fichier stdafx.h :
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
0
michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006
30 sept. 2005 à 17:42
PS : Joubliais, si vous avez un code erreur sur le fichier entête stdafx.h, il suffit de
Créer le fichier avec des commentaires genre :

Fichier stdafx.h :
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
0
Neo.balastik Messages postés 796 Date d'inscription jeudi 17 mai 2001 Statut Membre Dernière intervention 5 mai 2009 7
30 sept. 2005 à 21:02
C'est un site sur VB ici pas VC++ ....

Guy
0
Rejoignez-nous