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 :

[Débutant] Lecture Fichier Binaire


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 49
    Points
    49
    Par défaut [Débutant] Lecture Fichier Binaire
    Bonjour à tous,

    J'ai lu dans la FAQ qu'il était possible de lire un fichier binaire dans un flux fstream. J'ai donc appliqué le code ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::ifstream fichier("fichier.abs");
     
    if (fichier)
    {
         std::string ligne;
         while(std::getline(fichier,ligne))
         {
              std::cout<<ligne<<std:endl;
         }
    }
    Le problème est qu'il ne me ressort pas les valeurs hexadécimales dont j'ai besoin mais la correspondance ASCII...
    Existe-t-il un moyen d'avoir les valeurs hexadécimales à l'aide d'un flux fstream?

  2. #2
    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
    J'ai lu dans la FAQ qu'il était possible de lire un fichier binaire dans un flux fstream
    Ce que l'on appelle "lecture binaire" c'est la lecture "brute" des octets, càd sans interprétation des caractères spéciaux (retour à la ligne, etc.). Rien à voir avec la représentation binaire, qui de toute façon n'est qu'une représentation.

    La FAQ donne le code pour réaliser une lecture brute (ouverture avec le flag std::ios::binary et lecture avec la fonction read). Ensuite si tu veux une représentation hexadécimale plutôt que décimale, il y a également le code dans la FAQ (utiliser le manipulateur std::hex). Mais ce n'est qu'une représentation textuelle, le nombre sous-jacent sera toujours le même.

  3. #3
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Merci je vais tester l'exemple!

  4. #4
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Par rapport au code suivant (qui se trouve dans la FAQ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::ifstream FileIn("Toto.txt", std::ios_base::binary);
    int xin;
    FileIn.read(reinterpret_cast<char*>(&xin), sizeof(int));
    FileIn.close();
     
    std::cout << xin << std::endl;
    Si j'applique cela à mon fichier binaire, j'obtiens la valeur xin = 943064544 qui correspond aux 3 premiers octets de ma mémoire. Je suppose que ceci est du au fait qu'il s'agit d'une méthode "brute" mais n'y a-t-il pas moyen de lire octet par octet?

  5. #5
    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
    Lis un char au lieu de lire un int.

  6. #6
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    C'est ce que j'ai fait mais là il me met simplement un caractère mais ne correspondant pas au premier octet de mon fichier binaire. Voici comment je l'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::ifstream FileIn("Toto.txt", std::ios_base::binary);
    char xin;
    FileIn.read(reinterpret_cast<char*>(&xin), sizeof(xin));
    FileIn.close();
     
    std::cout << xin << std::endl;
    De plus, pour qu'il travaille octet par octet, comment puis-je faire? Car même si j'arrive à lire le char, je ne vois pas comment lui dire de passer au suivant...p-e en faisant une boucle jusqu'à la fin du fichier avec FileIn.read dans la boucle?

  7. #7
    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
    C'est ce que j'ai fait mais là il me met simplement un caractère mais ne correspondant pas au premier octet de mon fichier binaire.
    Pas normal. Tu obtiens quel caractère ?

    De plus, pour qu'il travaille octet par octet, comment puis-je faire? Car même si j'arrive à lire le char, je ne vois pas comment lui dire de passer au suivant...p-e en faisant une boucle jusqu'à la fin du fichier avec FileIn.read dans la boucle?
    Oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while (FileIn.read(&xin, sizeof(xin))) // pas besoin de transtyper en char*, c'en est déjà un
    {
        ...
    }
    Ou alors si tu connais la taille à lire, tu peux lire tous tes caractères en un coup.

  8. #8
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par Laurent Gomila
    Pas normal. Tu obtiens quel caractère ?
    En fait, je viens de remarquer que dans la console il affiche un o avec un accent mais si je debugge et que je vais voir la valeur de xin, il m'affiche bien un à, qui est effectivement le caractère qui doit s'y trouver...

    Je vais tester pour la boucle. Encore merci pour ton aide!

  9. #9
    Membre du Club
    Inscrit en
    Avril 2006
    Messages
    77
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 77
    Points : 49
    Points
    49
    Par défaut
    Ca fonctionne, c'est parfait! Un Grand Merci!

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

Discussions similaires

  1. Lecture fichier binaire et inversion d'octets
    Par zoro_le_renard dans le forum Fortran
    Réponses: 8
    Dernier message: 17/07/2007, 20h35
  2. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  3. Lecture fichier binaire
    Par kek_net dans le forum Langage
    Réponses: 5
    Dernier message: 07/08/2006, 19h37
  4. Lecture fichier binaire
    Par gabule dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 30/05/2006, 15h53
  5. [débutant] lecture fichier bmp en C++
    Par bmw13fr dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 09/03/2006, 22h33

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