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 :

filebuf et fstream


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Par défaut filebuf et fstream
    Bonjour

    actuellement sur mon projet cout et cerr sont redirigées dans des fichiers
    je voudrais surcharger un filebuffer afin d'avoir en début de ligne le temps de la trace, parce que cet info n'est pas présente systématiquement.

    Voici une ébauche adaptée de codeguru qui permet juste de dumper le flux dans une fenetre debug visual au moment de la synchronisation ou du débordement du buffer, je l'ai un peu modifier pour pouvoir ajouter du texte en début de ligne (pour l'instant pas grand chose, après j'y mettrai l'heure)

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    class dbgstreambuf : public filebuf
    {
    public:
    	dbgstreambuf(int filed);
    	virtual int sync();
    	virtual int overflow(int ch = EOF);
    protected:
    	void sendToDebugWindow();
    };
     
     
     
    // Allows use of operator << with cout to print to debug window
    // in Visual C++. This is a filebuf that echoes its output to the
    // specified file and the debug window at the same time. To use it you
    // need to attach it to an ostream so for example to attach it to cout
    // do the following:
    //
    // dbgstreambuf dbgbuf(1) // send output to stdout and debug window
    // cout = &dbgbuf;
    //
    // You can then use cout and operator << as usual - i.e cout << "test" << 3 << endl;
     
     
     
     
    // Constructor - just create filebuf
    dbgstreambuf::dbgstreambuf(int filed) : filebuf(filed)
    {
    }
     
    // This method is called to dump stuff in the put area out to the file.
    // We intercept it to send to debug window.
    int dbgstreambuf::sync()
    {
    	sendToDebugWindow();
     
    	if (filebuf::sync() == EOF)
    		pbump(-out_waiting());
     
    	return 0;
    }
     
    // This method is called to dump stuff in the put area out to the file.
    // We intercept it to send to debug window.
    int dbgstreambuf::overflow(int ch)
    {
    	sendToDebugWindow();
     
    	if (filebuf::overflow(ch) == EOF)
    		pbump(-out_waiting());
     
    	return 0;
    }
     
    // This is where the work happens - We grab a copy of what is in
    // the put area and send it to the debug window using OutputDebugString.
    void dbgstreambuf::sendToDebugWindow()
    {
    	// Get pointer to put area
    	char *buf = pbase();
    	// Number of bytes in put area
    	int count = out_waiting();
    	if (count) {
     
    		// Copy into our own buffer and send to OutputDebugString
    		char *dbgstring = new char [8+count + 1];
    		memset(dbgstring,'a',8);
    		memcpy( dbgstring+8, buf, count );
    		dbgstring[count+8] = '\0';
     
    		memcpy( buf,dbgstring,  count+8 );
    		pbump(8);
    		//setp(pbase(),epptr()+8);
    		OutputDebugString(dbgstring);
    		delete [] dbgstring;
    	}
    }

    bon déjà, que pensez-vous de l'idée?
    ensuite, c'est là que je coince, quand et comment fonctionne l'association avec un ofstream?
    je crois que je dois créer l'ofstream avec le constructeur par defaut, lui associer le buffer, et enfin ouvrir le fichier? est-ce que là je passe à coté d'un truc?
    merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Par défaut
    je me réponds moi même
    en fait j'ai fait une confusion entre les 2 classes, en utilisant seulement filebuf j'arrive à faire ce que je voulais
    par contre pour ceux que ça intéresserait il faut utiliser le constructeur par defaut de filebuf, sinon ça ne marche pas, et ouvrir le fichier avec la methode filebuf::open
    sinon si ça inspire quelque chose à quelqu'un je suis ouvert

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    Je n'ai pas le temps de regarder les détails, mais cela m'inspire:
    - la FAQ de fclc++
    - les 2 articles (quasi)fondateurs de James Kanze sur les streambuf filtrants
    - boost.iostream qui propose des facilités inspirées de tout cela.
    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
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Par défaut
    Je ne peux pas utiliser de lib externe à cause des licenses pas forcément "compatibles" entre elles.

    Je suis effectivement tombé sur des posts de james kanze sur le sujet, ainsi que des articles sur les sites drDobb et codeguru.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    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 296
    Par défaut
    On a vu bien plus contraignant que la BSL comme licence. En plus, rares sont les bibliothèques plus utiles que boost et qui soient incompatibles avec la BSL.
    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...

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2008
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 7
    Par défaut
    merci de ta contribution, mais je ne peux pas décider d'utiliser d'autre lib moi-même, ce n'est pas un projet perso

Discussions similaires

  1. fstream ou filebuf ?
    Par camboui dans le forum SL & STL
    Réponses: 4
    Dernier message: 02/07/2008, 16h13
  2. Problème de fstream passé en paramètre
    Par Beb8 dans le forum SL & STL
    Réponses: 2
    Dernier message: 11/04/2005, 11h51
  3. Fstream en .net
    Par charliejo dans le forum MFC
    Réponses: 5
    Dernier message: 30/03/2005, 17h55
  4. Problème avec fstream
    Par cach dans le forum SL & STL
    Réponses: 17
    Dernier message: 27/02/2005, 12h28
  5. Réponses: 11
    Dernier message: 13/10/2004, 00h58

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