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 :

[fstream] Lecture d'un fichier binaire


Sujet :

SL & STL C++

  1. #1
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut [fstream] Lecture d'un fichier binaire
    Bonjour à tous!

    Il faut bien le dire, je viens de passer pas mal de temps à essayer de faire les chose correctement à coup de read, ou de std::copy, mais il se passe pas grand chose à l'exécution...
    Mon problème est le suivant : je possède un gros fichier ( 60Mo) dans lequel est concaténé une centaine d'images en format "RAW" (16 bits). Le tout représentant un film bien entendu.

    Etant donné la taille du fichier, je vais lire les images une par une....
    L'idée est donc de créer un buffer de la taille d'une image, puis de copier le bout du fichier correspondant dans le buffer. Après je construit mon image à partir de ce buffer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::ifstream fichier ("test.bin", std::iosbase::binary);
    std::vector<unsigned short> vect ( 450 000);
     
    std::copy(std::istream_iterator<unsigned short>(fichier), end, std::back_inserter(vect) );
    Seulement, je ne peux pas mettre std::istream_iterator<unsigned short>()
    comme fin de flux, car ça me ferait lire tout le fichier!
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::istream_iterator<unsigned short>(fichier) + n
    n'existe pas !

    L'idée serait vraiment de pouvoir choisir le point de départ et le point d'arrivée du flux...
    Si vous avez une idée, je suis très très preneur !

    Merci !

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Les istream_iterator utilisent l'opérateur >> pour extraire les données, c'est donc pas vraiment compatible avec le mode d'ouverture binaire, et de manière générale avec ce que tu veux faire.

    La solution est beaucoup plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::ifstream fichier ("test.bin", std::iosbase::binary);
    std::vector<unsigned short> vect (450 000);
     
    fichier.read(reinterpret_cast<char*>(&vect[0]), vect.size() * sizeof(unsigned short));
    C'est également dans la

    Par contre attention à l'endianess si ton programme doit tourner sur différentes plateformes.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par Laurent Gomila
    La solution est beaucoup plus simple :
    Effectivement !
    C'est pas faute d'avoir parcouru la FAQ plus les forums pourtant ...
    Ca marche en tout cas! MERCI !

    J'ai choisi d'ouvrir le fichier en binaire, je sais pas ce que ça donne sinon. Je vais tester tiens...
    Quelle est la différence entre une ouverture normale et binaire? Serait-ce plus adapté dans mon cas?

    Merci Laurent !

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    L'ouverture "normale" permet d'interpréter les caractères spéciaux (comme les retours à la ligne par exemple), et convient donc pour une utilisation avec les opérateurs << et >>.

    L'ouverture binaire n'interprète rien du tout, les caractères sont pris tels quels ; ça convient donc pour une utilisation avec les fonctions read et write.

  5. #5
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Hum... L'ouverture binaire est t-elle plus rapide alors???

    C'est sur que dans mon cas, le fichier est une suite de pixel presque infinie, il n'y a pas de caractère spéciaux à lire !

  6. #6
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Hum... L'ouverture binaire est t-elle plus rapide alors???
    Le fait ne pas traiter de caractères spéciaux sera forcément plus rapide.

  7. #7
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    OK Merci encore Laurent pour ces précisions !

    Bonne journée,

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2006, 13h06
  2. lecture d'un fichier binaire
    Par booby dans le forum C
    Réponses: 17
    Dernier message: 20/09/2006, 16h11
  3. lecture d'un fichier binaire
    Par Tonta dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2006, 06h53
  4. lecture d'un fichier binaire en VB
    Par olivier] dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/12/2005, 11h17
  5. Lecture d'un fichier binaire
    Par Gloubie dans le forum Langage
    Réponses: 9
    Dernier message: 05/12/2005, 12h51

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