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 :

stream binaire en mémoire


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut stream binaire en mémoire
    Bonjour à tous,


    Je cherche à sauvegarde un contenu mémoire en binaire. La lecture de la mémoire se fait en plusieurs temps et à la fin, je place ça dans un fichier, ouvert en binaire.

    Mon souci c'est qu'il me faut un stream temporaire qui, si la lecture s'est bien passé, s'ajoute à mon fstream. Un peu de code serai bon je pense :

    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
     
    std::fstream oFile;
    oFile.open(m_strDataFile.c_str(), std::ios_base::app|std::ios_base::binary);
     
    [quelquechosestream] oStream;
    while(advance())
    {
        try
        {
            UnOperationPouvantMalSeTerminer();
            oStream << MonContenuBinaire;
        }
        catch(std::exception ex)
        {
            Log << "Problème : " << ex.what() << std::end;
            return;
        }
    };
     
    // arrivé ici c'est que tout s'est bien passé, on peut mettre dans le fichier
    oFile << [quelquechosestream];

    J'ai essayé en utilisant un stringstream déclaré en binaire, et le contenu en sortie dans le fichier est "0012FBC4" ce qui ressemble à une adresse de pointeur...

    L'idée c'est que si pendant la lecture il y a un problème, on écrit rien dans le fichier et on sort de la fonction.


    Pouvez-vous m'aider ?

    Merci

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  2. #2
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Bonsoir,
    Avec un stringstream c'est possible. Il faut passer par sa méthode str(). Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_ofstream << my_stringstream.str();
    Ceci dit, le fstream est bufferisé, donc passer par un tampon en mémoire n'as pas forcement d'intérêt.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Merci,

    Ca a l'air de fonctionner par contre dans mon fichier, le texte est lisible, c'est pas censé être des caractères bizarres ?

    Dans le fichier, j'ai "2titredescription1980". Le premier type à être rempli est un entier, il prend correctement la valeur "2", mais ensuite c'est au tour d'un std::string à être rempli et là ça bouffe le reste du contenu, ce qui est normal mais pas vraiment ce que j'attends.

    Est-ce que dans l'écriture je dois rajouter un "\0" ?


    Merci beaucoup,

    A bientôt
    "Heureusement qu'il y avait mon nez, sinon je l'aurais pris en pleine gueule" Walter Spanghero

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 19
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Ca a l'air de fonctionner par contre dans mon fichier, le texte est lisible, c'est pas censé être des caractères bizarres ?
    Si tu utilises "ostream << variable" justement il va transformer le contenu pour être lisible, c'est justement la principale utilité des streams même si ici c'est pas ce que tu veux

    Sinon tu peux essayer :
    ofstream.write(buffer, nombre d'octets);
    Cette fonction écrit directement sur le stream sans transformation

    En l'occurence ici en deux étapes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    while (advance()) {
      stringstream.write(data, length);
      totalLength += length;
    }
     
    ofstream.write(stringstream.str(), totalLength);
    Mais comme dit normalement tu peux aussi écrire directement sur le fstream car tant que tu n'utilises pas la fonction flush le contenu n'est pas écrit (attention au endl par contre qui fait ça implictement)

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

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Normalement l'opérateur << n'existe pas pour des écritures binaires!
    Il faut effectivement utiliser write().

Discussions similaires

  1. Chargement d'un fichier binaire en mémoire
    Par tonycalv dans le forum Assembleur
    Réponses: 9
    Dernier message: 10/10/2012, 17h38
  2. Réponses: 11
    Dernier message: 24/04/2009, 19h56
  3. manipulation de stream binaire en php
    Par unmanos dans le forum Langage
    Réponses: 1
    Dernier message: 10/07/2008, 18h09
  4. Streaming de fichiers ascii/binaires
    Par JBond007 dans le forum C++
    Réponses: 33
    Dernier message: 16/05/2008, 11h08
  5. Streams, binaires et autres lectures limitees
    Par Invité dans le forum C++
    Réponses: 1
    Dernier message: 05/07/2007, 14h49

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