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 :

[Fichiers] Recontruire un fichier binaire en fichier texte.


Sujet :

C++

  1. #1
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut [Fichiers] Recontruire un fichier binaire en fichier texte.
    Bonjour,
    j'avais fait un fichier en binaire que je voudrais à partir de ce fichier le refaire en mode texte.
    Il y a une solution rapide et/ou existante ?

    Ceci est un extrait de comment je lis une partie d'un fichier commun que je divise en 3 parties.
    Voici comment je recopie les parties concernés en binaire.
    Je voudrais donc que ces parties soient en mode texte au lieu d'en mode binaire.

    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
    short a,n,sympn;
    double b0, b1, b2, dummydoub;
    ......
    ......
    void make_kr()
    {
        ifstream f1;
    	f1.seekg (0,ios::beg);						/* start chances */
    	memset(illness,'\0',51);				/* and rules */
    	f1.read(illness,strlength);             /* only to start */
    	for( i = 1; i <= ll; i++) {
    		memset(illness,'\0',51);
            f1.read(illness,strlength);
            f1.read((char *)&b0,sizeof(double));
            f1.read((char *)&n,sizeof(short));
    		pp=p[i];
    		n=1;
    		while(n != 999){
            f1.read((char *)&b1,sizeof(double));
            f1.read((char *)&b2,sizeof(double));
            f1.read((char *)&n,sizeof(short));
    			eo[i]++;
    			rv[j]=rv[j]+fabs(pp*py/(pp*py+(1-pp)*pn)-
    				pp*(1-py)/(pp*(1-py)+(1-pp)*(1-pn)));
    			if( n != 999)
    				j=n;
    		}
    		il[i]=eo[i];
    	}
    }
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    Mon conseil: Définis bien ta structure de données, charge tout d'un coup en binaire, puis re-sauvegarde tout d'un coup en texte.

    Quand ça marchera, tu pourras envisager de le faire par "morceaux".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par mess-mate Voir le message
    j'avais fait un fichier en binaire que je voudrais à partir de ce fichier le refaire en mode texte.
    Attention, il n'existe pas de fichiers en binaire ou de fichiers en texte. C'est l'interprétation que tu en fait qui les rend binaire ou texte.

    Un fichier par lui même est un flux d'octets dont les valeurs vont de 0 à 255 (ou de -128 à 127).
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    Ahem!
    Ce que tu dis est exagéré.

    Il y a une distinction entre fichier binaire et fichier texte, et généralement cette distinction s'appuie sur différents critères:
    • Possibilité de lecture par un humain
    • Présence de caractères non-imprimables autre que Tab, CR et LF (ou de caractères non-ASCII, dans certains cas).

    Typiquement, s'il y a des octets nuls, c'est généralement un fichier binaire. Mais ce qui distingue le plus, c'est la façon dont est écrit un nombre.
    • Forme brute, X octets -> fichier binaire.
    • Nombre exprimé sous forme de chaîne dans une certaine base (le plus souvent décimal ou hexadécimal) -> fichier texte.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Je suis globalement d'accord avec toi mais les 2 points que tu cites (et je n'en voie pas d'autre)
    • Possibilité de lecture par un humain
    • Présence de caractères non-imprimables autre que Tab, CR et LF (ou de caractères non-ASCII, dans certains cas).


    sont plus liés à l'interprétation du fichier (ou du caractère) qu'autre chose.

    Je pense qu'il est possible de générer un fichier binaire (jpg, gif, doc, ...) qui respecte les 2 conditions précédentes mais malgré tout, cela ne sera pas un fichier texte car cela sera du texte incompréhensible genre "dfkjdlkjsfefn;,,wxnq;,z".
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    En effet, ces critères sont plutôt subjectifs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Pour clarifier un peu plus,
    le data n'a aucune terminaison (\0 par ex.).
    Ce qui veut dire que un double est lu dans un string sans terminaison aucune. C'est ce qu'on peut voire dans le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f1.read((char *)&b1,sizeof(double));
    J'ai bien trouvé une fonction qui peut le faire ( en test manuel) mais y'a pas plus simple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <string>
    #include <sstream>
    #include <iostream>
     
    double hex2dec (string str)
    {
    double num;
    istringstream i(str);
    i >> hex >> num;
    return num;
    }
    car ainsi je suis obligé de faire de même pour un int,long et short.
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    Attends. Tu veux dire que ton "format texte", c'est juste une bète expression en hexadécimal de chaque octet du fichier binaire?

    C'est un format texte à la fois pourri et inutile (sauf si tu veux transmettre le fichier sur une connexion 7 bits, et encore, le base64 est bien plus économique que l'hexadécimal). Ne peux-tu pas décider d'un format texte plus potable?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Effectivement !!Je veux dire que le fichier binaire est construit au plus bas niveau. C'est de ce fichier que je veux faire un fichier texte.
    Ce qui fait que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double num = hex2dec("7B14AE47E17A943F0100CDCCCCCCCCCC");
    me donne en décimal: 0.02
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Attends. Tu veux dire que ton "format texte", c'est juste une bète expression en hexadécimal de chaque octet du fichier binaire?

    C'est un format texte à la fois pourri et inutile
    Tu as déjà déchiffré une trame d'un protocole réseau? Si oui, alors tu sais qu'il est parfois utile d'avoir un fichier texte contenant un dump hexa!

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    Mais dans ce cas, j'appelle ça un dump. Pas "refaire en mode texte".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Il n'existe pas des strto..... pour des conversions en i,ui,ul,l,d ??
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    strtod ne marche qu'en décimal.
    Là, en supposant que ton double soit au format IEEE, tu devras utiliser strtoull() pour en faire un long long, puis faire un memcpy() vers un double.

    Et pour convertir le double en notation hexadécimale, eh bien, faire l'inverse: memcpy() vers un long long puis affichage...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par mess-mate Voir le message
    J'ai bien trouvé une fonction qui peut le faire ( en test manuel) mais y'a pas plus simple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <string>
    #include <sstream>
    #include <iostream>
     
    double hex2dec (string str)
    {
    double num;
    istringstream i(str);
    i >> hex >> num;
    return num;
    }
    car ainsi je suis obligé de faire de même pour un int,long et short.
    Bon ça marche pas, il faut inverser le string.
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

  15. #15
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 567
    Points
    41 567
    Par défaut
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    double int64ToIeee64(unsigned long long num)
    {
    	double numf;
    	assert(sizeof num == sizeof numf);
    	memcpy(&numf, &num, sizeof num);
    	return numf;
    }
     
    double hex2ieee64(string const &str)
    {
    	unsigned long long num;
    	istringstream iss(str);
    	iss >> hex >> num;
    	return int64ToIeee64(num);
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre averti Avatar de mess-mate
    Inscrit en
    Septembre 2008
    Messages
    352
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 352
    Points : 358
    Points
    358
    Par défaut
    Merci, mais je m'en sort pas du tout...

    Voilà j'ai lu du fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f1.read((char *)&b0,sizeof(double));
    Je recopie ce data dans un fichier également binaire. Là pas de problème.
    Mais je voudrais que b0 soit écrit dans un fichier texte. ( comme 0.02 = sa valeur décimale)
    Dont voici un extrait d'un fichier texte similaire:
    0.02,1,0.9,0.05,2,0.8,0.02,3,0.8,0.02,5,0.6,0.01,6,1.0,0.01,
    ou
    0.02000000, 1,0.90000000,0.05000000, 2,0.80000000,0.02000000, 3,0.80000000,0.02000000, 5,0.60000000,0.01000000, 6,1.00000000,0.01000000,

    Ces fichiers sont construits de façon à ce que les records occupent 512B
    amicalement, mess-mate ( debian/debian-like )
    Une petite recherche sur le forum...et hop
    LOGIC will get you from A to B ...... IMAGINATION will take you EVERYWHERE
    Albert

Discussions similaires

  1. fichiers binaires et fichiers text
    Par popmnadi dans le forum C
    Réponses: 26
    Dernier message: 09/04/2013, 11h58
  2. Réponses: 6
    Dernier message: 14/03/2007, 14h36
  3. Lecture ou conversion en fichier d'un vecteur binaire
    Par Armitage1982 dans le forum SL & STL
    Réponses: 3
    Dernier message: 21/12/2006, 23h46
  4. Manipulation binaire de fichiers
    Par Vladislav IV dans le forum Général Python
    Réponses: 1
    Dernier message: 04/08/2006, 11h33
  5. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 16h58

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