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 :

Lecture ou conversion en fichier d'un vecteur binaire


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 21
    Points : 69
    Points
    69
    Par défaut Lecture ou conversion en fichier d'un vecteur binaire
    Bonjour

    Je débute en C++ à l'aide de ClanLib et je souhaiterai utiliser son gestionnaire de ressource raw pour lire un fichier situé dans une archive.

    Les données une fois récupérées sont disponibles dans un vecteur binaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<unsigned char>
    Comment pourrais-je procéder afin de transformer ce vecteur en un objet FILE exploitable par la fonction fread ?

    Cependant, j'aimerai autant que possible ne pas écrire de fichier sur le disque, les ressources sont relativement petites.

    Et si cela n'est pas possible, pourriez-vous m'indiquer la bonne manière de récupérer successivement différent type de variable (bool, int, float et char) depuis ce vecteur ?

    Merci

    ps : je privilégie la conversion en fichier pour fread, car le programme est déjà écrit en ce sens.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Comment pourrais-je procéder afin de transformer ce vecteur en un objet FILE exploitable par la fonction fread ?
    Tu peux pas.
    Boost ftw

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Armitage1982
    a- Comment pourrais-je procéder afin de transformer ce vecteur en un objet FILE exploitable par la fonction fread ?

    Cependant, j'aimerai autant que possible ne pas écrire de fichier sur le disque, les ressources sont relativement petites.

    b- Et si cela n'est pas possible, pourriez-vous m'indiquer la bonne manière de récupérer successivement différent type de variable (bool, int, float et char) depuis ce vecteur ?
    a- A part sauver le fichier je ne vois pas. Si tu avais attendu un flux C++ on aurait pu faire quelque chose pour toi. Là, pas vraiment.

    b- Un vecteur n'est qu'un tableau qui fourni des services en plus. Quand je n'ai pas de problème d'endianess à me préoccuper, j'aime bien faire ce genre de choses pour désérialiser.
    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
    template <typename T, class C>
    int fetch(C const& c, int i, int m, T & v)
    {
       if (i+sizeof(T) > m) return i-m;
       memcpy(&v, &c[i], sizeof(T));
       return i+sizeof(T);
    }
     
    ...
    const M = vect.size();
    int i = 0;
    boost::int64      i64; 
    boost::double64 d64; // je supposes que boost les défini, mais je peux me planter
    i = fetch(vect, i, M, i64); if (i<0) throw ...
    i = fetch(vect, i, M, d64); if (i<0) throw ...
    Ce code marchera aussi avec des buffers et des tableaux statiques.

    Reste à vérifier que le type de la valeur résultat est bien un type primitif POD.

    Ceci dit, on peut étendre le code en jouant avec les classes de traits (qui sauraient lire des chaines zero-terminées vers des string, ou des buffers, voire même dans des tableaux statiques).

    En sortant des listes de types (cf Modern C++ Design d'Andrei Alexandrescu, et/ou loki qui en découle), il y a moyen de faire des trucs pas mal du tout.

    Et définitivement, ce code n'est pas correct relativement à l'endianess. Fais une recherche dans le forum pour une solution plus correcte.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2006
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2006
    Messages : 21
    Points : 69
    Points
    69
    Par défaut
    Bon et bien merci pour ces quelques précisions Luc Hermitte

    Pour l'instant l'usage d'une archive n'est pas totalement justifiée alors je préfère encore faire sans vu les complications. De plus, ça améliore les vitesses de chargement.

    Je reviendrai poster une réponse si d'aventure je trouve une solution.

    Merci

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/11/2007, 15h50
  2. [LabView-MATLAB] Conversion de fichier binaire
    Par flzox dans le forum LabVIEW
    Réponses: 3
    Dernier message: 20/01/2007, 18h42
  3. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  4. conversion de fichier Excel en csv ,
    Par bounette dans le forum Excel
    Réponses: 2
    Dernier message: 26/01/2005, 08h42
  5. Optimisation de la lecture de tres gros fichiers
    Par Lydie dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/07/2004, 14h09

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