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 :

lecture de fichier binaire et extraction de double


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut lecture de fichier binaire et extraction de double
    Bonjour à tous,

    Je me tourne vers vous car je suis à cours d'idée pour résoudre ma problématique. Je galère un peu.

    Je travail sur le développement d'un Reader de fichiers binaires issus d'une application qui s'appelle NASTRAN. Le format du fichier binaire est totalement indépendant de ma volonté.

    Dans ces fameux fichiers se trouvent des résultats de calculs sur des structures mécanique (pièce d'avion, bateau, ...). Les résultats sont triés par type et répartis dans des blocs de données.

    Et la je rencontre un cas particulier : j'ai un double dont les 4 premier octets sont sur la fin d'un bloc, et les 4 dernier octets sur le bloc suivant.
    Et bien sur les deux bloc de données ne sont pas "collés" des informations sont écrites entre deux.

    Alors j'ai imaginé une solution :
    - Lire le binaire octet par octet en gérant le changement de bloc de donnée
    - Réunir tous mes octets pour reconstituer mon double.

    Et voici ma question :

    Comment peut-on recréer un double à partir de mes 8 octets ?


    voici un exemple simplifié de ce que je fait.
    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
     
     
        byte b1,b2,b3,b4,b5,b6,b7,b8;
     
        std::fread(&b1,1,1,_pFile);
        std::fread(&b2,1,1,_pFile);
        std::fread(&b3,1,1,_pFile);
        std::fread(&b4,1,1,_pFile);
     
        //changement de bloc de donnée
     
        std::fread(&b5,1,1,_pFile);
        std::fread(&b6,1,1,_pFile);
        std::fread(&b7,1,1,_pFile);
        std::fread(&b8,1,1,_pFile);
     
        double d= (b1 << 64) | (b2 << 48) | (b3 << 40)  | (b4 << 32) | (b5 << 24) |(b6 << 16) | (b7 << 8) | b8;
    Ce code ne produit pas de bon résultat d'après mes tests.

    J'ai pensé à cherche du coté des flux, mais je ne maîtrise pas assez le sujet je pense.

    Merci d'avance pour vos réponse.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double d;
    std::fread(&d, sizeof(double), 1, _pFile);
    ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Merci pour la réponse rapide.

    Alors la solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double d;
    std::fread(&d, sizeof(double), 1, _pFile);
    Ne fonctionne pas.

    C'est bien sur la première chose que j'ai implémenté dans mon code.

    Ce que j'essaye d'expliquer c'est que mon double n'est pas écrit d'un seul tenant dans le fichier. Le code binaire correspondant au double que je cherche à lire est découpé en 2 et réparti sur deux section différente du fichier.

    Du coup l'utilisation du fread avec directement un double en paramètre ne fonctionne pas.

    D'ou la lecture du binaire octet par octet. Ca me permet de récupérer mes deux morceaux de binaire.

    Je que je ne sais pas faire, c'est réunir ces deux morceaux et les transformer en double.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    As-tu essayé le reinterpret_cast ?
    Je doute que sans ce soit possible.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    J'ai vu le sujet concernant le reinterpret_cast sur la FAQ c++ mais je n'ai pas encore tenté de l'utiliser.

    Je teste ça et je continue mes recherche sur le sujet. Je poste des news dès que j'en sais plus.

    Merci Bousk pour le temps que tu m'accorde.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur 3D
    Inscrit en
    Avril 2008
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur 3D

    Informations forums :
    Inscription : Avril 2008
    Messages : 400
    Points : 968
    Points
    968
    Par défaut
    Un petit truc a coup de memcpy devrait marcher, je pense. Par contre je sais pas si c'est très propre et très c++.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* ptr = (char*)&leDouble;
    memcpy(octets1, ptr, nbOctets1);
    mempcy(octets2, ptr+nbOctets1, nbOctets2);

  7. #7
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2011
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Le coup du memcpy fonctionne très bien merci.

    J'ai testé ça ce matin dans un mini projet et je retrouve bien mes donnée. Après il faudra que je gère l'endianness.


    Merci pour vôtre aide en tout cas, je passe le sujet en résolut.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2011, 11h43
  2. Lecture de fichier binaire et gestion de fin de fichier
    Par habasque dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 02/05/2007, 17h06
  3. lecture ecriture fichier binaire
    Par jonckers dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/04/2007, 09h12
  4. Réponses: 5
    Dernier message: 26/03/2007, 01h30
  5. lecture de fichier binaire
    Par Salim6 dans le forum C
    Réponses: 3
    Dernier message: 07/11/2005, 19h56

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