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 :

convertir une ostream en istream


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut convertir une ostream en istream
    Je vous explique mon problème. J'ai une fonction qui prend en paramètre un fichier PPM (image couleur) et qui le convertit en fichier PGM (image en niveaux de gris).

    Je dispose d'une bibliothèque qui ne travaille qu'avec les fichiers PGM. Cette bibliothèque me fournit un objet "Image" qui s'initialise ainsi :
    Image = load(std::string filename); // Charge un fichier PGM à partir d'un fichier
    ou ainsi :
    Image = read(std::istream& in); // Pareil mais à partir d'un flux

    Donc pour me permettre de travailler avec des fichiers PPM, j'ai tout de suite eu le reflexe de créer une fonction qui prend en paramètre un fichier PPM et qui me renvoie un flux (std::ostream) qui contient le fichier PGM généré.

    Maintenant, comment je peux faire pour utiliser le flux généré dans la fonction read (sachant que celle-ci attend un flux d'entrée) ???

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut
    En réalité je veux faire marcher ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Image* read(std::istream&);
     
    int main()
    {
        std::iostream ios;
        Image* img;
        Pnm pnm("test.pnm");
        pnm.convert_to_pgm();
     
        pnm >> ios;
     
        img = read(ios);
    }
    Le problème c'est que le seul constructeur du type iostream, c'est :
    iostream (streambuf * sb);
    Et moi, je ne sais pas trop ce qu'il faut passer en paramètre au constructeur. J'ai tenté de lui passer 0 en paramètre (on sait jamais) mais alors la méthode ios.good() renvoie false.


  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 120
    Par défaut
    bon ben ok j'ai trouvé mais merci à ceux qui ont lu mon problème.
    Solution, initialiser un objet de type stringbuf et le passer en paramètre au constructeur de iostream

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Heu, juste une petite question... as-tu conscience que ofstream et ifstream sont deux flux sur des fichiers qui ont des buts fondamentalement différents

    Un ofstream est un flux sortant alors qu'un ifstream est un flux entrant.

    La solution la plus simple à mettre en oeuvre (mais il faut avouer que c'est aussi vraissemblablement la plus lente) serait, tout simplement, de passer réellement par un fichier temporaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    std::string str="temp.ppm";
    std::ofstream ofs(str.c_str()/* ,les options d'ouvertures qui vont bien pour l'écriture*/);
    ofs<<ton_image; /* ou toute autre manière d'enregistrer ton image */
    /*  au choix */
    std::ifstream ifs(str.c_str()/*, les options d'ouverture qui vont bien pour la lecture */);
    Image=read(ifs);
    /* ou */
    Image=load(str);
    Il devrait, cependant, pouvoir y avoir un solution qui consisterait à se rappeler qu'au final, ifstream et ofstream se rejoingent tous les deux, par leur héritage, au sein de la classe basic_streambuf et qui *pourrait* permettre de remplire le buffer d'un coté et de le récupérer de l'autre
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    La solution la plus simple à mettre en oeuvre (mais il faut avouer que c'est aussi vraissemblablement la plus lente) serait, tout simplement, de passer réellement par un fichier temporaire:
    Et pourquoi pas par une chaîne temporaire (stringstream), plutôt qu'un fichier ?

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Laurent Gomila
    Et pourquoi pas par une chaîne temporaire (stringstream), plutôt qu'un fichier ?
    Heuu... parce que je n'y avais pas pensé
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pourtant c'est à coup sur bien plus pratique

  8. #8
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Citation Envoyé par Alp
    Pourtant c'est à coup sur bien plus pratique
    Ah ça ss'est ssur, ah ça ss'est ssur...

    Simplement comme il était parti sur *fstream, j'ai, sans pousser la réflexion plus loin (je l'aurais pourtant fait en temps normal ) embrayé sur une solution à base de *fstream
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Par défaut
    ce n'est pas une idée bete de vouloir faire un istream a partir d'un ostream
    ca permet de chainer les flux
    ca existe en Java et c'est pratique des fois.

    et je trouve pas ca pratique de toujours tout mettre en memoire ...

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

Discussions similaires

  1. Convertir une chaine en format heure
    Par Lars dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2005, 11h44
  2. Convertir une date en type string
    Par ziboux dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 29/10/2003, 10h52
  3. [dbase3]Convertir une base de données sous windows
    Par nux dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 04/10/2003, 14h25
  4. Réponses: 3
    Dernier message: 28/09/2003, 10h46
  5. Convertir une AnsiString en hexadecimal
    Par manathan01 dans le forum C++Builder
    Réponses: 3
    Dernier message: 26/12/2002, 09h27

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