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 :

problème lecture fichier binaire


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut problème lecture fichier binaire
    bonjour tout le monde

    j'essaie d'écrire un petit programme qui lit des octet précises dans un fichier binaire pour en extraire des données "lisible"
    mais j'ai un petit problème, a un moment je dois lire 2 octets pour obtenir l'année du fichier et je n'y arrive pas pourriez vous me donner un petit coup de main

    voila mon bout de code
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
     
    int main()
    {
     
    	std::vector<std::vector<char>> ver ;
    	std::ifstream fgrb("20230620.grb", std::ios::in | std::ios::binary);
     
            /// date et heure du fichier
    	std::string annee; std::string mois;  std::string jour;
     
            ///lecture Octet 28 à 29 pour année
     
    	fgrb.seekg(28);    /// devrait lire 07 en hexadécimal
    	fgrb.seekg(29);    /// devrait lire E7 en hexadécimal
    	char y1;
    	fgrb.read((&y1), 1);
    	char y2;
    	fgrb.read((&y2), 1);
    	annee = std::to_string(static_cast<int>((y1 << 8) | y2));
    	std::cout << "annee:" << annee << std::endl;      /// donne -6394  (E7 06 en hexa) ce qui correspond aux octets 29 et 30?
     
           /// lecture Octet 30 pour mois
     
    	fgrb.seekg(30);  
    	char m;
    	fgrb.read((&m), 1);
    	mois = std::to_string(static_cast<int>(m));
    	std::cout << "mois:" << mois << std::endl;
     
           /// lecture Octet 31 pour jour
     
    	fgrb.seekg(31);  
    	char j;
    	fgrb.read((&j), 1);
    	jour = std::to_string(static_cast<int>(j));
    	std::cout << "jour:" << jour << std::endl;
     
     
    	std::cout << "date du fichier:" << jour << "-" << mois << "-" << annee << std::endl;
     
    	fgrb.close();
     
            return 0;
     
    }
    je vous joins mon fichier 20230620.zip


    merci d'avance

  2. #2
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        fgrb.seekg(28);    /// devrait lire 07 en hexadécimal
        fgrb.seekg(29);    /// devrait lire E7 en hexadécimal
    Ces deux instruction ne lisent rien, elles positionnent le curseur de fichier.
    Ce sont les deux fgrb.read qui suivent qui vont lire et comme tu es positionné à la position 29, tu vas lire la 29 et la 30 puisque à chaque lecture le curseur de fichier est déplacé de ce qu'il a lu.
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  3. #3
    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
    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.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    merci pour vos réponse
    donc j'ai fait quelques modifications:

    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
     
    #include <iostream>
    #include <fstream>
    #include <string>
     
    int main()
    {
     
    	std::ifstream fgrb("20230620.00.012.grb", std::ios::in | std::ios::binary);
     
            /// année du fichier
    	fgrb.seekg(28);     /// positionnement du curseur sur l'octet 29
    	char* buffer = new char[2];
    	fgrb.read((buffer), 2);        /// lecture de 2 octets
    	int annee = (int)buffer[0] | (int)buffer[1] << 8;
    	std::cout << "annee : " << annee << std::endl;
    	fgrb.close();
     
            return 0;
    je lis maintenant les bonnes octets mais j'obtiens année = -6393 qui donne E7 07 en hexadécimal alors qu'il faudrait l'inverse 07 E7 pour 2023

  5. #5
    CGi
    CGi est déconnecté
    Expert éminent
    Avatar de CGi
    Inscrit en
    Mars 2002
    Messages
    1 030
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 1 030
    Points : 8 202
    Points
    8 202
    Par défaut
    Ton fichier est en big indian et toi tu travailles en little indian. Ton année est sur deux octets, tu peux la lire dans un entier 16 bits puis inverser les deux octets de l'entier.
    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
    #include <iostream>#include <fstream>
     
     
    int main()
    {
        std::fstream fgrb("20230620.grb", std::ios::in | std::ios::binary);
        fgrb.seekg(28);
     
     
        uint16_t y;
        fgrb.read(reinterpret_cast<char*>(&y), 2);
        y = (y>>8) | (y << 8);
     
     
        std::cout << "annee:" << y << std::endl;
     
     
        fgrb.close();
    }
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Avril 2021
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Avril 2021
    Messages : 17
    Points : 10
    Points
    10
    Par défaut
    ok je testerai lundi encore une petite question comment fait on pour savoir si le fichier est en Big ou little endian et est il possible de changer l'encodage du fichier entier ?
    dernière chose j'aurai a lire plus loin dans le fichier des entiers sur 4 octets, la manip est la même ?
    bon week-end

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Citation Envoyé par rg71800 Voir le message
    ok je testerai lundi encore une petite question comment fait on pour savoir si le fichier est en Big ou little endian et est il possible de changer l'encodage du fichier entier ?
    C'est dans le specs du fichier, il pourrait même avoir des données en little-endian et d'autres en big-endian. Le fichier a un encodage défini, ça serait un beau merdier si en plus on pouvait le changer.
    Citation Envoyé par rg71800 Voir le message
    dernière chose j'aurai a lire plus loin dans le fichier des entiers sur 4 octets, la manip est la même ?
    Oui, on lit du plus signifiant au moins signifiant, ou l'inverse.

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

Discussions similaires

  1. Problème lecture fichier binaire
    Par santino2008 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 19/03/2010, 19h13
  2. Probléme de lecture fichier Binaire!
    Par HadJack dans le forum C++
    Réponses: 5
    Dernier message: 05/08/2009, 17h19
  3. problème ecriture et lecture fichier binaire
    Par gonzo59 dans le forum C++
    Réponses: 5
    Dernier message: 16/04/2009, 20h02
  4. [debutant] problème lecture fichier binaire
    Par julien.63 dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2007, 22h12
  5. Problème lecture fichier en C++
    Par cali1983 dans le forum C++
    Réponses: 17
    Dernier message: 20/05/2005, 09h36

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