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

SL & STL C++ Discussion :

Problème d'entrée sortie binaire dans un fichier (fstream)


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut Problème d'entrée sortie binaire dans un fichier (fstream)
    J'avais tout d'abord posté ça sur le forum Visual C++, mais même si j'édite en VC++, ce problème est un problème C++ c'est pourquoi, je le remets là :


    Quelqu'un peut m'expliquer pourquoi le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		ofstream f(fichierConf, ios::binary | ios::out | ios::hex);
    		f.setmode(filebuf::binary);
    		if(f.bad()) YC_RERREUR("Impossible d'ouvrir le fichier correctement");
    		f << hex << 16 << 2;
    		f.close();
    Crée un fichier, qui quand on l'ouvre avec un éditeur hexadécimal a cette allure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Partie hexa               Partie ascii
    31 30 32                    102
    Personnellement, je voudrais avoir cette allure là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Partie hexa               Partie ascii
    10 00 00 02 00 00         ......
    Quelqu'un a une explication ?

    Merci d'avance,
    Cyrik

  2. #2
    Fry
    Fry est déconnecté
    Membre régulier Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Points : 119
    Points
    119
    Par défaut
    tu peu utiliser setw setfill ....
    definit dans iomanip j crois pour faire le decalage et mettre a 0

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Fry
    tu peu utiliser setw setfill ....
    definit dans iomanip j crois pour faire le decalage et mettre a 0
    En effet, je peux utiliser setw() pour indiquer le nombre d'octet à prendre pour chaque valeur, et aussi fill() pour indiquer par quel caractère je veux remplir les octets inutilisés. Mais je cherche surtout à écrire les valeurs dans la partie Hexadécimal et non dans la partie ascii.

  4. #4
    Fry
    Fry est déconnecté
    Membre régulier Avatar de Fry
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    150
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 150
    Points : 119
    Points
    119
    Par défaut
    en fait je pense que c a cause de f << hex << 16 << 2;
    t a essayer f << 16 << 2; ?
    hex specifie que tu ecris en carcactere sous forme hexadecimal alors que si tu copie directe la valeur ca serait toujours la meme quel que soit la base

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Donne nous un exemple concret avec ce que tu écris, ce que tu obtiens et ce que tu aimerais obtenir.

    PS: ios_base::binary, c'est juste pour le traitement des fins de lignes. Ton fichier semble être un fichier texte, je pense que tu peux l'ouvrir normalement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Hum ... Et bien ... Je vous donne un exemple.
    Regardons les fichiers de sauvegarde de la plupart des programmes commerciaux. Ils ne sont pas en mode texte. Lorsqu'il faut sauvegarder la valeur numérique 81 par exemple, nous verons dans un édieur hexadécimal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HEXA              ASCII
    51 00 00         !..
    Voila exactement ce que je veux faire... Donc, si je veux sauvegarder la valeur 81 dans un fichier, je veux, quand j'ouvre ce fichier avec un éditeur texte, obtenir ! et pas 81 ou 51.

    Ainsi, je fais un gain de place (une valeur numérique prendra toujours 3 octets et pas un octet par puissance de 10). Et puis mes data ne sont plus lisibles par un étranger ^^.

    Une autre façon de voir ça, c'est de savoir s'il y a un moyen d'obtenir le résultat obtenu par le code suivant mais de façon plus rapide et plus transparente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	ofstream f("cmontexte.dat", ios::out);
    	if(f.bad()) YC_RERREUR("Impossible d'ouvrir le fichier correctement");
    	int valAEcrire = 16025;
    	char valAEcrire1 = (char) (valAEcrire % (1<<8));
    	char valAEcrire2 = (char) ((valAEcrire/(1<<8)) % (1<<8));
    	char valAEcrire3 = (char) ((valAEcrire/(1<<16)) % (1<<8));
    	char valAEcrire4 = (char) ((valAEcrire/(1<<24)) % (1<<8));
    	f << valAEcrire1 << valAEcrire2 << valAEcrire3 << valAEcrire4;
    Le résutlat est dans un éditeur hexa :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    HEXA                ASCII
    99 3E 00 00       (un carré que je n'arrive pas à reproduire)>..
    Cyrik

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Utilise std::ostream::write().
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    Ah merci ! Ca marche. Je fais une copie pure de la mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ofstream f("cmontexte.dat", ios::out);
    	if(f.bad()) YC_RERREUR("Impossible d'ouvrir le fichier correctement");
    	int valAEcrire = 16025;
    	f.write((char*)&valAEcrire,4);
    	f.close();
    Ca marche parfaitement. Maintenant, à tout hasard, j'aimerais savoir s'il existe la même chose mais qui gère le typage (du genre f << var qui sait reconnaître le type de var et code en fonction). Ou bien si il existe un meilleur moyen pour calculer la taille en octets que prennent les différents types qu'utiliser LIMITS.H (qui donne les bornes des types de base) et un log.

    Dans le cas contraire, je surchargerais mes opérateurs << et >> mais bon ... Si c t possible ^^, ce serait plus simple !

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Le sujet a été débattu il y a peu, tu trouveras des infos interessantes dans ce topic.

    PS : les int ne font pas toujours 4 octets, par contre ils font toujours sizeof(int)

  10. #10
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 26
    Points : 17
    Points
    17
    Par défaut
    des fois, je suis con ...

    Merci à tous


    Cyrik

  11. #11
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Luc Hermitte
    Utilise std::ostream::write().
    Et dans ce cas, le fichier ne sera plus lisible sur une autre machien, voire avec une autre version du même compilateur (y compris d'autres options de compilation).
    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.

  12. #12
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Sauf s'il découpe son nombre comme il avait commencé à le faire. C'est vrai que je n'avais pas précisé. Penser aussi à ne pas utiliser les types standard dont on ne connait rien sur la taille.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 01/11/2008, 15h57
  2. Réponses: 5
    Dernier message: 07/03/2008, 11h44
  3. Problème d'entrée de données dans un formulaire
    Par issam16 dans le forum Access
    Réponses: 3
    Dernier message: 05/07/2006, 11h47
  4. Lecture d'un nombre binaire dans un fichier ASCII
    Par semenzato dans le forum MFC
    Réponses: 1
    Dernier message: 13/04/2006, 22h41
  5. Problème de rangement de structure dans un fichier ...
    Par Freeze dans le forum C++Builder
    Réponses: 8
    Dernier message: 16/12/2003, 16h46

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