IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

[API Windows] Pb écriture dans fichier unicode


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut [API Windows] Pb écriture dans fichier unicode
    Bonjour,

    J'essaie d'écrire un fichier unicode. J'écris dans le fichier de façon binaire. Je commence par écriture la signature d'un fichier Unicode (0xFFFE), et ensuite j'écris des données.

    L'écriture du texte marche bien, mais j'ai un soucis pour écrire le retour à la ligne. En unicode, il faut ajouter \r\n, soit 0x0d et 0x0a en héxadécimal.
    Or ça m'écrit un caractère inconnu, et pire encore, \n est écrit sur 3 octets dans mon fichier (mon fichier fait 41 octets, alors que je n'écris que 38 octets confirmé par cbWrite). Du coup, il y a un décalage d'un octet entre chaque ligne du coup, seulement une ligne sur 2 est lisible !!!

    Voici le code illustrant mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <Windows.h>
    #include <stdio.h>
    #include <tchar.h>
     
    int APIENTRY				WinMain(HINSTANCE hInstance,
    									HINSTANCE hPrevInstance,
    									LPSTR     lpCmdLine,
    									int       nCmdShow)
    {
    	CHAR					achDOM[]    = {(CHAR) 0xff, (CHAR) 0xfe};	// Signature fichier Unicode
    	CHAR					achBuffer[] = {(CHAR) 0x61, (CHAR) 0x00,	// a
    										   (CHAR) 0x62, (CHAR) 0x00,	// b
    										   (CHAR) 0x63, (CHAR) 0x00,	// c
    										   (CHAR) 0x0d, (CHAR) 0x00,	// \r
    										   (CHAR) 0x0a, (CHAR) 0x00,	// \n
    										   (CHAR) 0x64, (CHAR) 0x00,	// d
    										   (CHAR) 0x65, (CHAR) 0x00,	// e
    										   (CHAR) 0x66, (CHAR) 0x00,	// f
    										   (CHAR) 0x0d, (CHAR) 0x00,	// \r
    										   (CHAR) 0x0a, (CHAR) 0x00,	// \n
    										   (CHAR) 0x67, (CHAR) 0x00,	// g
    										   (CHAR) 0x68, (CHAR) 0x00,	// h
    										   (CHAR) 0x69, (CHAR) 0x00,	// i
    										   (CHAR) 0x0d, (CHAR) 0x00,	// \r
    										   (CHAR) 0x0a, (CHAR) 0x00,	// \n
    										   (CHAR) 0x6a, (CHAR) 0x00,	// j
    										   (CHAR) 0x6b, (CHAR) 0x00,	// k
    										   (CHAR) 0x6c, (CHAR) 0x00};	// l
    	FILE					*hFile;
    	size_t					cbWrite;
     
    	hFile = _tfopen(TEXT("file.txt"), TEXT("w"));
     
    	if (hFile)
    	{
    		cbWrite = fwrite(achDOM, sizeof(CHAR), 2, hFile);
    		cbWrite = fwrite(achBuffer, sizeof(CHAR), 36, hFile);
    		fclose(hFile);
    	}
     
    	return 0;
    }
    Et voici le fichier généré :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    abc
    ਍搀攀昀ഀഀ
    ghi
    ਍樀欀氀
    Ai-je fait une erreur quelque part?

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tu es sûr que tu es en binaire ?

    Rajoute un b à côté du w dans ton _tfopen.

  3. #3
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Effectivement, avec l'option b, ça marche maintenant

    Merci.

    P.S: Sais-tu comment c'est interprété lorsque le fichier est géré en mode text ou lieu du mode binaire?

    Merci encore.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je ne connais pas les API C pour écrire dans un fichier (et encore moins trafiquées à la mode windows), mais a priori, si tu veux ouvrir un fichier en binaire, pour qu'il n'interprète pas de lui même les caractères de fin de ligne, tu dois passer un flag à fopen.

    Maintenant, il y a plus packagé pour écrire en UCS-2 dans un fichier, à la mode C++. Une fois défini un bon codecvt, tu peux le faire tout simplement à partir d'un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os << "bc\ndeefg" << endl;
    Désolé, mais je ne pense pas pouvoir te passer celui que j'utilise au boulot. Peut-être ton compilateur en fourni-t-il un déjà fait ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Je dois codé en API Windows, je préfèrerai en C++ standard avec STL et boost, mais pas le choix, je dois m'adapter au langage de mon entreprise

    En tout cas, en spécifiant l'option binaire dans fopen a résolu mon problème

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Sous windows, fopen (depuis Visual 2005) peut prendre un encodage en paramètre. Cf la doc de msdn à ce niveau.

    Ça te simplifiera la tâche.

  7. #7
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Oui je sais, sauf que là non plus je n'ai pas le choix => VC++ 6.0

    J'ai demandé à faire évoluer le compilateur, ils n'ont pas voulu car tous les autres programmes ont été écris avec VC++ 6.0

    Du coup, je crée une fonction permettant de lire et écrire correctement dans un fichier quelque soit l'encodage ...

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    fopen n'est pas une API windows, mais une API C modifiée par windows.

    Si tu veux l'API windows (avec CreateFile), http://www.developpez.net/forums/f16...ation-windows/
    Si tu veux du C : http://www.developpez.net/forums/f18/c-cpp/c/
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre éclairé Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Par défaut
    Merci pour ces spécification.
    Etant habitué à codé en standard, j'ai encore un peu de mal à m'habituer à l'API windows et différencier ce qui est API Windows ou pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Fichiers] écriture dans fichier
    Par kij dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 12/06/2007, 11h38
  2. Huffman et écriture dans fichier
    Par kuja2053 dans le forum C
    Réponses: 6
    Dernier message: 04/05/2007, 14h52
  3. [API Windows] Coloration syntaxique dans le RICHEDIT
    Par Dev-FX dans le forum Windows
    Réponses: 8
    Dernier message: 12/04/2007, 23h10
  4. Besoin d'aide écriture dans fichier
    Par boniface dans le forum Modules
    Réponses: 3
    Dernier message: 29/01/2007, 18h06
  5. Réponses: 2
    Dernier message: 15/11/2005, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo