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 :

Instancier [i/o]stream


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut Instancier [i/o]stream
    Bonjour c'est une question toute bete :
    Comment puis-je faire pour instancier un ostream ou un istream sans pour autant qu'il soit connecté un a fichier ?

    J'ai cru comprendre qu'on pouvait en instancier sur une instance de streambuf mais je n'arrive pas non plus a instancier un streambuf

    Le compilateur me parle de "char_traits" ou "<CharT, _Traits>" et je ne vois pas trop ce que c'est... Donc question subsidiaire : que sont les "char_traits" ou "<CharT, _Traits>" ?

    Chers développeurs, cheres développeuses ; d'avance 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
    Un flux n'est par défaut connecté à aucun streambuf.

  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
    char est une classe de trait pour les "char"...
    Voir le lien : http://alp.developpez.com/tutoriels/traitspolicies/

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    poukill : Merci c'est parfait, je regarde ça direct

    Laurent:
    Citation Envoyé par Laurent Gomila Voir le message
    Un flux n'est par défaut connecté à aucun streambuf.
    Ok ça me rassure d'un coté parce que l'utilisation d'un flux pur sera moins laborieuse que prévue ^^.
    En fait mon compilateur se plaint quand j'ajoute "std::ostream mystream;" en private a ma classe.

    Voici le message d'erreur : (gcc sous code::blocks)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/include/g++-v4/ostream:342: error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits<char>]' is protected
    MPacker.cpp:6: error: within this context
    /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/include/g++-v4/ostream:342: error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits<char>]' is protected
    MPacker.cpp:9: error: within this context
    /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/include/g++-v4/ostream:342: error: 'std::basic_ostream<_CharT, _Traits>::basic_ostream() [with _CharT = char, _Traits = std::char_traits<char>]' is protected
    MPacker.cpp:12: error: within this context
    :: === Build finished: 6 errors, 0 warnings ===
    et au cas ou voici les lignes 6 à 24 de mon fichier:
    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
     
    MPacker::MPacker(const char *s){
    	initClass(s);
    }
    MPacker::MPacker(string& s){
    	initClass(s.c_str());
    }
    MPacker::MPacker(MString& s){
    	initClass(s.toString());
    }
     
    MPacker::~MPacker(){
    	this->write();
    }
     
    void MPacker::initClass(const char *s){
    	this->canWrite=false;
    	this->iFields=0;
    	this->szFilename.assign(s);
    }

  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
    Ah, ben ça veut dire que j'ai dit une bêtise
    Apparemment on ne peut pas construire un flux par défaut, il lui faut obligatoirement un streambuf. Tu peux toujours tenter de passer NULL à son constructeur, mais je ne suis pas sûr du résultat.

  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
    Salut,

    Je ne vois pas vraiment ce que tu veux faire...

    les istream et ostream sont en fait des variable globales dans l'espace de nomage std et sont "branchés" par défaut sur l'écran (pour ostream) ou sur le clavier (pour istream)

    (C'est sûrement pas tout à fait vrai ni tout à fait complet, mais le principe y est )

    Au mieux, tu peux les "rediriger" vers un autre périphérique ou vers autre chose, mais cela n'a que peu de sens de vouloir en faire un membre privé d'une classe bien précise.

    Si tu veux gérer des flux de données au sein d'une classe, ce serait plutôt, selon le cas, un flux fichier (*fstream) ou un flux de conversion de chaine (*stringtream) qu'il faudrait utiliser, non
    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
    screetch
    Invité(e)
    Par défaut
    tu ne confonds pas avec cin et cout ?

    istream et ostream sont des typedefs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef basic_istream<char, char_traits<char> > istream;
    typedef basic_ostream<char, char_traits<char> > ostream;
    le but serait ici de les utiliser dans un premier temps sans les brancher sur rien.

    Cela n'a pas de sens, on souhaite qu'apres la construction on puisse appeler << ou >>.

    Il est peut etre preferable de passer par in istream* initialisé a 0 puis de creer l'objet.

  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 screetch Voir le message
    tu ne confonds pas avec cin et cout ?

    istream et ostream sont des typedefs
    Ah, peut être bien (sûrement d'ailleurs )

    Mais je reste convaincu que, dans une large mesure, l'utilisation d'un istream ou d'un ostream comme membre est par trop... générale, et que l'on aurait sûrement intérêt à prévoir un flux un peu plus précis.
    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
    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
    Une petite recherche sur basic_istream (étant donné que istream n'en est qu'un typedef ) m'a mené, entre autre, à cette information concernant le constructeur:
    Constructor & Destructor Documentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<typename _CharT, typename _Traits>
    std::basic_istream< _CharT, _Traits >::basic_istream 	
    ( 	__streambuf_type *  	__sb 	 )  	[inline, explicit]
    Base constructor.

    This ctor is almost never called by the user directly, rather from derived classes' initialization lists, which pass a pointer to their own stream buffer.

    Definition at line 97 of file istream.
    Cela sous entend que, pour l'appeler, il faut lui fournir un pointeur sur __streambuf_type, mais la doc indique clairement que l'utilisateur ne devrait jamais appeler le constructeur directement et préférer passer les classes dérivées.

    Les classes dérivée de basic_istream sont basic_istringstream basic_iostream et basic_fstream, ainsi que le montre le diagramme d'héritage

    Ce qui va relativement bien dans le sens de ce que je dis, un istream est peut être un peu trop général pour servir de membre
    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

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Une petite recherche sur basic_istream (étant donné que istream n'en est qu'un typedef ) m'a mené, entre autre, à cette information concernant le constructeur:

    Cela sous entend que, pour l'appeler, il faut lui fournir un pointeur sur __streambuf_type, mais la doc indique clairement que l'utilisateur ne devrait jamais appeler le constructeur directement et préférer passer les classes dérivées.

    Les classes dérivée de basic_istream sont basic_istringstream basic_iostream et basic_fstream, ainsi que le montre le diagramme d'héritage

    Ce qui va relativement bien dans le sens de ce que je dis, un istream est peut être un peu trop général pour servir de membre
    Ok! Le fait que le compilateur me parle de templates est plus clair a présent!

    Et bien en fait mon but et d'avoir un classe qui va jouer le role dans une certaine mesure de manipulateur. Je m'explique : en fait l'utilisation principale est de stocker des données sur un flux que la classe va arranger en structure organisée. Pour l'instant le but principale est effectivement d'obtenir un fichier structuré. Pour le moment je m'en sors avec un stringstream qui va recevoir les données. Le contenu du fichier est donc stocké sous forme de string au sein du flux d'apres ce que j'ai compris.
    Le truc c'est que je voudrais que ce flux soit assez générique pour un maximum d'utilisations, par example si j'agrandis ma classe :
    qu'elle puisse recevoir aussi bien des données en provenance de strings, de ofstreams, ou bien pourquoi pas des classes de flux "persos" qui acheminerais les données par réseau, ou je ne sais quel autre source ?

    Donc en fait ça se trouve un stringstream est assez générique pour tout ça ? Qu'en pensez vous ?

  11. #11
    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
    http://kanze.james.neuf.fr/articles-fr.html pourrait t'intéresser
    Ca permet de créer des sortes de "filtres".

    Pour faire la même chose, il existe une bibliothèque qui fait une grosse partie du boulot à ta place : Boost.Iostreams. Google te donnera tout ce qu'il faut.

  12. #12
    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
    Et, je ne fais que proposer la solution, pourquoi ne pas, tout simplement, utiliser un stringstream

    De cette manière, tu pourra rajouter tout ce que tu veux avec
    et la récupérer au bon format avec
    Cela permet une gestion "indirecte" (à préciser au fur et à mesure de l'évolution) de ton problème non
    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

  13. #13
    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
    Les liens que j'ai donné expliquent comment filtrer/formater à notre guise des échanges dans les flux.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 63
    Par défaut
    OK super merci pour les liens je vais voir ce que je peux faire avec les stringstreams

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/03/2015, 15h26
  2. DirectSound et le streaming
    Par Shakram dans le forum DirectX
    Réponses: 57
    Dernier message: 09/06/2005, 11h05
  3. Streaming video sous Linux
    Par freeshman dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 03/01/2004, 17h17
  4. Streaming fichier PDF
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 22/05/2003, 22h14
  5. Comment enregistrer un stream de longueur fixe ?
    Par Alcarbone dans le forum MFC
    Réponses: 5
    Dernier message: 13/04/2003, 20h14

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