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 :

[std::ifstream] Lecture de fichier en mode binaire


Sujet :

SL & STL C++

  1. #1
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut [std::ifstream] Lecture de fichier en mode binaire
    Bonjour,
    Je lis des fichiers en mode binaire, et je "rate" des octets à la lecture...
    C'est à dire :
    j'ouvre un fichier avec le mode "binary" en argument de ifstream::open(), et je rate systèmatiquement le 9ème octet
    C'est à dire qu'il lit le 8ème puis passe au 10ème sans lire le 9ème...
    Testé avec le debugger le bout de code suivant :

    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
     
    std::ifstream I;
    I.open( "nom_du_fichier", std::);
    unsigned char Byte=0;
    if ( I.is_open() )
    {
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;
       I >> Byte;   
       I >> Byte;
    }
    (je ne me souviens plus de l'argument exact : je ne suis pas sur mon pc de dev').

    Je ne comprends pas vraiment ce qui se passe...
    Plutôt bizarre, non ?

  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 573
    Points
    41 573
    Par défaut
    Que contiennent les premiers octets du fichier?

  3. #3
    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 : 40
    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
    Et avec I.read(&Byte, sizeof(Byte)), ça change quelque chose ?

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    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 279
    Points : 11 015
    Points
    11 015
    Par défaut
    L'opérateur d'extraction va interpréter les espaces, et pour les fins de lignes je ne sais pas trop. Quelque soit le mode d'ouverture.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Tout comme Luc et Loulou. Si ton fichier contient des données binaires brutes, il ne faut pas
    utiliser les opérateurs << et >>, mais les fonctions membre read() et write().
    Les operateurs >> et << interprêtent les caractères spéciaux quelque soit le mode
    d'ouverture.
    Un petit exemple pour t'en convaincre
    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
    #include <iostream>
    #include <fstream>
     
    using namespace std;
     
    int main()
    {
      // Creation d'un fichier contentant un entier 
      unsigned value = 0xFF0AFE0D; // un CR et un LF
      ofstream out("buf.out");
      out.write((char*)&value, sizeof(value));
      out.close();
     
      // Lecture avec les opérateurs formatés
      ifstream in("buf.out", ios::binary);
      for (int i=0; i < 4; ++i) {
        unsigned char byte;
        in >> byte;
        cout << (int)byte << endl;
      }
      in.close();
     
      cout << "--" << endl;
     
      // Lecture avec les fontions 'brutes'
      ifstream in2("buf.out");
      for (int i=0; i < 4; ++i)
      {
        unsigned char byte;
        in2.read((char*)&byte, sizeof(byte));
        cout << (int)byte << endl;
      }
    }

Discussions similaires

  1. lecture d'un fichier en mode binaire ou hexa
    Par lrgtk dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 13/10/2010, 09h36
  2. [std::ifstream] Lecture formatée lente
    Par HanLee dans le forum SL & STL
    Réponses: 15
    Dernier message: 31/05/2009, 01h35
  3. Ecriture dans un fichier en mode binaire
    Par greg1517 dans le forum C
    Réponses: 14
    Dernier message: 11/02/2008, 17h35
  4. ifstream lecture de fichier disparu
    Par Mizar75 dans le forum C++
    Réponses: 21
    Dernier message: 24/10/2007, 11h56
  5. ouverture/lecture/ecriture dans un fichier en mode binaire
    Par dirty_boy dans le forum Débuter
    Réponses: 2
    Dernier message: 15/03/2006, 08h38

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