Partager via


strstreambuf, classe

Décrit une mémoire tampon de flux qui contrôle la transmission d'éléments vers et à partir d'une séquence d'éléments stockée dans un objet de tableau char.

Syntaxe

class strstreambuf : public streambuf

Notes

Selon la façon dont l'objet est construit, il peut être alloué, étendu et libéré en fonction des modifications apportées à la séquence.

Un objet de classe strstreambuf stocke plusieurs bits d'information de mode en tant que mode strstreambuf. Ces bits indiquent si la séquence contrôlée :

  • a été allouée et doit être libérée par la suite ;

  • est modifiable ;

  • est extensible en réallouant le stockage ;

  • a été figée et doit donc être défigée avant que l'objet soit détruit, ou libérée (si elle a été allouée) par une agence autre que l'objet.

Vous ne pouvez pas modifier ou étendre une séquence contrôlée figée, quel que soit l'état de ces bits de mode distincts.

L'objet stocke également des pointeurs vers deux fonctions qui contrôlent l'allocation de strstreambuf. Si ces pointeurs sont null, l'objet définit sa propre méthode d'allocation et de libération du stockage pour la séquence contrôlée.

Remarque

Cette classe est déconseillée. Utilisez à la place stringbuf ou wstringbuf.

Constructeurs

Constructeur Description
strstreambuf Construit un objet de type strstreambuf.

Fonctions Membre

Fonction membre Description
freeze Fait en sorte qu'une mémoire tampon de flux soit indisponible via des opérations de mémoire tampon de flux.
overflow Fonction virtuelle protégée qui peut être appelée quand un nouveau caractère est inséré dans une mémoire tampon saturée.
pbackfail Fonction membre virtuelle protégée qui tente de replacer un élément dans le flux d'entrée, puis d'en faire l'élément actif (vers lequel pointe le pointeur suivant).
pcount Retourne le nombre d'éléments écrits dans la séquence contrôlée.
seekoff Fonction membre virtuelle protégée qui tente de modifier les positions actuelles des flux contrôlés.
seekpos Fonction membre virtuelle protégée qui tente de modifier les positions actuelles des flux contrôlés.
str Appelle freeze, puis retourne un pointeur vers le début de la séquence contrôlée.
underflow Fonction virtuelle protégée pour extraire l'élément actuel du flux d'entrée.

Spécifications

Header :<strstream>

Espace de noms : std

strstreambuf ::freeze

Fait en sorte qu'une mémoire tampon de flux soit indisponible via des opérations de mémoire tampon de flux.

void freeze(bool _Freezeit = true);

Paramètres

_Freezeit
bool indiquant si vous souhaitez que le flux soit gelé.

Notes

Si _Freezeit a la valeur true, la fonction modifie le mode stocké strstreambuf pour que la séquence contrôlée soit figée. Dans le cas contraire, elle rend la séquence contrôlée non gelée.

str implique freeze.

Remarque

Une mémoire tampon gelée n’est pas libérée pendant la destruction de strstreambuf. Vous devez dégeler la mémoire tampon avant de la libérer pour éviter une fuite de mémoire.

Exemple

// strstreambuf_freeze.cpp
// compile with: /EHsc

#include <iostream>
#include <strstream>

using namespace std;

void report(strstream &x)
{
    if (!x.good())
        cout << "stream bad" << endl;
    else
        cout << "stream good" << endl;
}

int main()
{
    strstream x;

    x << "test1";
    cout << "before freeze: ";
    report(x);

    // Calling str freezes stream.
    cout.write(x.rdbuf()->str(), 5) << endl;
    cout << "after freeze: ";
    report(x);

    // Stream is bad now, wrote on frozen stream
    x << "test1.5";
    cout << "after write to frozen stream: ";
    report(x);

    // Unfreeze stream, but it is still bad
    x.rdbuf()->freeze(false);
    cout << "after unfreezing stream: ";
    report(x);

    // Clear stream
    x.clear();
    cout << "after clearing stream: ";
    report(x);

    x << "test3";
    cout.write(x.rdbuf()->str(), 10) << endl;

    // Clean up.  Failure to unfreeze stream will cause a
    // memory leak.
    x.rdbuf()->freeze(false);
}
before freeze: stream good
test1
after freeze: stream good
after write to frozen stream: stream bad
after unfreezing stream: stream bad
after clearing stream: stream good
test1test3

strstreambuf ::overflow

Fonction virtuelle protégée qui peut être appelée quand un nouveau caractère est inséré dans une mémoire tampon saturée.

virtual int overflow(int _Meta = EOF);

Paramètres

_Meta
Caractère à insérer dans la mémoire tampon, ou EOF.

Valeur de retour

Si la fonction ne peut pas réussir, elle retourne EOF. Sinon, si _MetaEOF == , elle retourne une valeur autre que .EOF Sinon, elle retourne _Meta.

Notes

Si _Meta != EOF, la fonction membre virtuelle protégée tente d’insérer l’élément (char)_Meta dans la mémoire tampon de sortie. Elle peut le faire de différentes manières :

  • Si une position d’écriture est disponible, elle peut stocker l’élément dans la position d’écriture et incrémenter le pointeur suivant pour la mémoire tampon de sortie.

  • Si le mode strstreambuf stocké indique que la séquence contrôlée est modifiable, extensible et non gelée, la fonction peut proposer une position d’écriture en en allouant une nouvelle pour la mémoire tampon de sortie. Cette façon d’étendre la mémoire tampon de sortie permet également d’étendre les mémoires tampons d’entrée associées.

strstreambuf ::p backfail

Fonction membre virtuelle protégée qui tente de replacer un élément dans le flux d’entrée, puis d’en faire l’élément actif (vers lequel pointe le pointeur suivant).

virtual int pbackfail(int _Meta = EOF);

Paramètres

_Meta
Caractère à insérer dans la mémoire tampon, ou EOF.

Valeur de retour

Si la fonction ne peut pas réussir, elle retourne EOF. Sinon, si _MetaEOF == , elle retourne une valeur autre que .EOF Sinon, elle retourne _Meta.

Notes

La fonction membre virtuelle protégée tente de replacer un élément dans la mémoire tampon d’entrée, puis d’en faire l’élément actif (vers lequel pointe le pointeur suivant).

Si _Meta == EOF, l’élément à renvoyer est effectivement celui déjà présent dans le flux avant l’élément actuel. Sinon, cet élément est remplacé par ch = (char)_Meta. La fonction peut remettre un élément de différentes manières :

  • Si une position de putback est disponible et que l’élément stocké y est égal ch, il peut décrémenter le pointeur suivant pour la mémoire tampon d’entrée.

  • Si une position de putback est disponible et si le mode strstreambuf indique que la séquence contrôlée est modifiable, la fonction peut stocker ch dans la position de putback et décrémenter le pointeur suivant pour la mémoire tampon d’entrée.

strstreambuf ::p count

Retourne le nombre d'éléments écrits dans la séquence contrôlée.

streamsize pcount() const;

Valeur de retour

Un décompte du nombre d’éléments écrits dans la séquence contrôlée.

Notes

En particulier, si pptr est un pointeur Null, la fonction retourne zéro. Sinon, elle retourne pptr - pbase.

Exemple

// strstreambuf_pcount.cpp
// compile with: /EHsc
#include <iostream>
#include <strstream>
using namespace std;

int main( )
{
   strstream x;
   x << "test1";
   cout << x.rdbuf( )->pcount( ) << endl;
   x << "test2";
   cout << x.rdbuf( )->pcount( ) << endl;
}

strstreambuf ::seekoff

Fonction membre virtuelle protégée qui tente de modifier les positions actuelles des flux contrôlés.

virtual streampos seekoff(streamoff _Off,
    ios_base::seekdir _Way,
    ios_base::openmode _Which = ios_base::in | ios_base::out);

Paramètres

_Off
Position à rechercher par rapport à _Way.

_Façon
Point de départ des opérations de décalage. Consultez seekdir pour connaître les valeurs possibles.

_Qui
Spécifie le mode pour la position du pointeur. Par défaut, vous êtes autorisé à modifier les positions de lecture et d’écriture.

Valeur de retour

Si la fonction réussit à modifier une ou les deux positions de flux, elle retourne la position de flux obtenue. Sinon, elle échoue et retourne une position de flux non valide.

Notes

La fonction membre virtuelle protégée s’efforce de modifier les positions actuelles des flux contrôlés. Pour un objet de classe strstreambuf, une position de flux se compose uniquement d’un décalage de flux. Le décalage zéro désigne le premier élément de la séquence contrôlée.

La nouvelle position est déterminée comme suit :

  • Si _Way == ios_base::beg, la nouvelle position est le début du flux plus _Off.

  • Si _Way == ios_base::cur, la nouvelle position est la position actuelle du flux plus _Off.

  • Si _Way == ios_base::end, la nouvelle position est la fin du flux plus _Off.

Si _Which & ios_base::in elle n’est pas nulle et que la mémoire tampon d’entrée existe, la fonction modifie la position suivante pour lire dans la mémoire tampon d’entrée. Si _Which & ios_base::out elle n’est pas égale à zéro, _Way != ios_base::curet que la mémoire tampon de sortie existe, la fonction définit également la position suivante à écrire pour qu’elle corresponde à la position suivante à lire.

Dans le cas contraire, si _Which & ios_base::out est différent de zéro et que la mémoire tampon de sortie existe, la fonction modifie la position suivante d’écriture dans la mémoire tampon de sortie. Dans le cas contraire, l’opération de positionnement échoue. Pour qu’une opération de positionnement réussisse, la position de flux obtenue doit se trouver dans la séquence contrôlée.

strstreambuf ::seekpos

Fonction membre virtuelle protégée qui tente de modifier les positions actuelles des flux contrôlés.

virtual streampos seekpos(streampos _Sp, ios_base::openmode _Which = ios_base::in | ios_base::out);

Paramètres

_Sp
Position à rechercher.

_Qui
Spécifie le mode pour la position du pointeur. Par défaut, vous êtes autorisé à modifier les positions de lecture et d’écriture.

Valeur de retour

Si la fonction réussit à modifier une ou les deux positions de flux, elle retourne la position de flux obtenue. Sinon, elle échoue et retourne une position de flux non valide. Pour déterminer si la position du flux est non valide, comparez la valeur de retour à pos_type(off_type(-1)).

Notes

La fonction membre virtuelle protégée s’efforce de modifier les positions actuelles des flux contrôlés. Pour un objet de classe strstreambuf, une position de flux se compose uniquement d’un décalage de flux. Le décalage zéro désigne le premier élément de la séquence contrôlée. La nouvelle position est déterminée par _Sp.

Si _Which & ios_base ::in n’est pas zéro et que la mémoire tampon d’entrée existe, la fonction modifie la position suivante pour lire dans la mémoire tampon d’entrée. Si _Which & ios_base::out est différent de zéro et que la mémoire tampon de sortie existe, la fonction définit également la position suivante à écrire pour qu’elle corresponde à la position suivante à lire. Sinon, si _Which & est différent de ios_base::out zéro et que la mémoire tampon de sortie existe, la fonction modifie la position suivante pour écrire dans la mémoire tampon de sortie. Dans le cas contraire, l’opération de positionnement échoue. Pour qu’une opération de positionnement réussisse, la position de flux obtenue doit se trouver dans la séquence contrôlée.

strstreambuf ::str

Appelle freeze, puis retourne un pointeur vers le début de la séquence contrôlée.

char *str();

Valeur de retour

Pointeur vers le début de la séquence contrôlée.

Notes

Aucun élément Null de fin n’existe, à moins que n’en insériez explicitement un.

Exemple

Consultez strstreambuf::freeze pour obtenir un exemple qui utilise str.

strstreambuf ::strstreambuf

Construit un objet de type strstreambuf.

explicit strstreambuf(streamsize count = 0);

strstreambuf(void (* alloc_func)(size_t),
    void (* free_func)(void*));

strstreambuf(char* getptr,
    streamsize count,
    char* putptr = 0);

strstreambuf(signed char* getptr,
    streamsize count,
    signed char* putptr = 0);

strstreambuf(unsigned char* getptr,
    streamsize count,
    unsigned char* putptr = 0);

strstreambuf(const char* getptr,
    streamsize count);

strstreambuf(const signed char* getptr,
    streamsize count);

strstreambuf(const unsigned char* getptr,
    streamsize count);

Paramètres

alloc_func
Fonction utilisée pour allouer de la mémoire tampon.

count
Détermine la longueur de la mémoire tampon pointée par getptr. Si getptr n’est pas un argument (premier formulaire de constructeur), une taille d’allocation suggérée pour les mémoires tampons.

_Freefunc
Fonction utilisée pour libérer de la mémoire tampon.

getptr
Mémoire tampon utilisée pour l’entrée.

putptr
Mémoire tampon utilisée pour la sortie.

Notes

Le premier constructeur stocke un pointeur Null dans tous les pointeurs contrôlant la mémoire tampon d’entrée, la mémoire tampon de sortie et l’allocation strstreambuf. Il définit le mode strstreambuf stocké pour rendre la séquence contrôlée modifiable et extensible. Il accepte également le nombre comme taille d’allocation initiale suggérée.

Le deuxième constructeur se comporte comme le premier, sauf qu’il stocke alloc_func comme pointeur vers la fonction à appeler pour allouer le stockage et free_func comme pointeur vers la fonction pour appeler pour libérer ce stockage.

Les trois constructeurs :

strstreambuf(char *getptr,
    streamsize count,
    char *putptr = 0);

strstreambuf(signed char *getptr,
    streamsize count,
    signed char *putptr = 0);

strstreambuf(unsigned char *getptr,
    streamsize count,
    unsigned char *putptr = 0);

se comporte également comme le premier, sauf que getptr désigne l’objet de tableau utilisé pour contenir la séquence contrôlée. (Par conséquent, il ne doit pas s’agir d’un pointeur Null.) Le nombre d’éléments N dans le tableau est déterminé comme suit :

  • Si (nombre> 0), N est le nombre.

  • Si (nombre == 0), alors N est strlen((const char *) getptr ).

  • Si (nombre< 0), N est INT_MAX.

Si putptr est un pointeur Null, la fonction établit simplement une mémoire tampon d’entrée en exécutant :

setg(getptr,
    getptr,
    getptr + N);

Sinon, elle établit des mémoires tampons d’entrée et de sortie en exécutant :

setg(getptr,
    getptr,
    putptr);

setp(putptr,
    getptr + N);

Dans ce cas, putptr doit être dans l’intervalle [ getptr, getptr + N].

Enfin, les trois constructeurs :

strstreambuf(const char *getptr,
    streamsize count);

strstreambuf(const signed char *getptr,
    streamsize count);

strstreambuf(const unsigned char *getptr,
    streamsize count);

se comportent tous comme :

streambuf((char *)getptr, count);

si ce n’est que le mode stocké ne rend la séquence contrôlée ni modifiable, ni extensible.

strstreambuf ::underflow

Fonction virtuelle protégée pour extraire l'élément actuel du flux d'entrée.

virtual int underflow();

Valeur de retour

Si la fonction ne peut pas réussir, elle retourne EOF. Sinon, elle retourne l’élément actuel dans le flux d’entrée, converti comme décrit ci-dessus.

Notes

La fonction membre virtuelle protégée s’efforce d’extraire l’élément ch actuel de la mémoire tampon d’entrée, puis d’avancer la position du flux actuel et de renvoyer l’élément en tant que (int)(unsigned char)ch. Il peut le faire d’une seule manière : si une position de lecture est disponible, elle prend ch comme élément stocké dans la position de lecture et avance le pointeur suivant pour la mémoire tampon d’entrée.

Voir aussi

streambuf
Sécurité des threads dans la bibliothèque C++ Standard
iostream, programmation
iostreams, conventions