Compartir vía


strstreambuf (Clase)

Describe un búfer de secuencia que controla la transmisión de elementos hacia y desde una secuencia de elementos almacenados en un objeto de matriz char.

Sintaxis

class strstreambuf : public streambuf

Comentarios

En función de cómo se haya construido el objeto, se puede asignar, extender y liberar según sea necesario para dar cabida a los cambios en la secuencia.

Un objeto de clase strstreambuf almacena varios bits de información de modo como su modo strstreambuf. Estos bits indican si la secuencia controlada:

  • Se ha asignado y debe liberarse finalmente.

  • Es modificable.

  • Es extensible mediante la reasignación de almacenamiento.

  • Se ha quedado inmovilizada y, por tanto, se debe movilizar antes de que se destruya el objeto o liberar (en el caso de estar asignado) por parte de un organismo que no sea el objeto.

Una secuencia controlada inmovilizada no se puede modificar ni extender, independientemente del estado de estos bits de modo independiente.

El objeto también almacena punteros a dos funciones que controlan la asignación strstreambuf. Si se trata de punteros nulos, el objeto diseña su propio método para asignar y liberar el almacenamiento de la secuencia controlada.

Nota:

Esta clase está en desuso. Considere el uso de stringbuf o wstringbuf en su lugar.

Constructores

Constructor Descripción
strstreambuf Construye un objeto de tipo strstreambuf.

Funciones miembro

Función de miembro Descripción
freeze Hace que un búfer de secuencia no esté disponible a través de las operaciones de búfer de secuencia.
overflow Función virtual protegida a la que se puede llamar cuando se inserta un carácter nuevo en un búfer lleno.
pbackfail Función miembro virtual protegida que intenta recolocar un elemento en el flujo de entrada y, después, convertirlo en el elemento actual (al que apunta el puntero siguiente).
pcount Devuelve un recuento del número de elementos que se escriben en la secuencia controlada.
seekoff Función miembro virtual protegida que trata de modificar las posiciones actuales de las secuencias controladas.
seekpos Función miembro virtual protegida que trata de modificar las posiciones actuales de las secuencias controladas.
str Llama a freeze y, después, devuelve un puntero al principio de la secuencia controlada.
underflow Función virtual protegida que extrae el elemento actual del flujo de entrada.

Requisitos

Encabezado:<strstream>

Espacio de nombres: std

strstreambuf::freeze

Hace que un búfer de secuencia no esté disponible a través de las operaciones de búfer de secuencia.

void freeze(bool _Freezeit = true);

Parámetros

_Freezeit
Un bool que indica si quiere que la secuencia se detenga.

Comentarios

Si _Freezeit es true, la función modifica el modo de strstreambuf almacenado para inmovilizar la secuencia controlada. De lo contrario, hace que la secuencia controlada no esté inmovilizada.

str implica freeze.

Nota:

Un búfer inmovilizado no se liberará durante la destrucción de strstreambuf. Debe liberar el búfer antes de que se libere para evitar una pérdida de memoria.

Ejemplo

// 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

Función virtual protegida a la que se puede llamar cuando se inserta un carácter nuevo en un búfer lleno.

virtual int overflow(int _Meta = EOF);

Parámetros

_Meta
El carácter que se va a insertar en el búfer o EOF.

Valor devuelto

Si la función no se ejecuta correctamente, devuelve EOF. De lo contrario, si _Meta == EOF, devuelve un valor distinto de EOF. De lo contrario, devuelve _Meta.

Comentarios

Si _Meta != EOF, la función miembro virtual protegida intenta insertar el elemento (char)_Meta en el búfer de salida. Puede hacerlo de varias maneras:

  • Si está disponible una posición de escritura, puede almacenar el elemento en la posición de escritura e incrementar el puntero siguiente para el búfer de salida.

  • Si el modo de strstreambuf almacenado indica que la secuencia controlada es modificable, ampliable y no está inmovilizada, la función puede disponer de una posición de escritura mediante la asignación de new para el búfer de salida. Extender el búfer de salida de esta forma también extiende cualquier búfer de entrada asociado.

strstreambuf::p backfail

Una función miembro virtual protegida que intenta devolver un elemento al flujo de entrada y, después, convertirlo en el elemento actual (al que apunta el puntero siguiente).

virtual int pbackfail(int _Meta = EOF);

Parámetros

_Meta
El carácter que se va a insertar en el búfer o EOF.

Valor devuelto

Si la función no se ejecuta correctamente, devuelve EOF. De lo contrario, si _Meta == EOF, devuelve un valor distinto de EOF. De lo contrario, devuelve _Meta.

Comentarios

La función miembro virtual protegida intenta devolver un elemento al búfer de entrada y, después, convertirlo en el elemento actual (indicado por el siguiente puntero).

Si _Meta == EOF, el elemento que se va a devolver es realmente el que ya está en el flujo por delante del elemento actual. De lo contrario, dicho elemento se sustituye por ch = (char)_Meta. La función puede devolver un elemento de distintas maneras:

  • Si hay disponible una posición de devolución y el elemento almacenado es igual a ch, puede disminuir el puntero siguiente para el búfer de entrada.

  • Si está disponible una posición de devolución y si el modo de strstreambuf indica que la secuencia controlada es modificable, la función puede almacenar ch en la posición de devolución y disminuir el puntero siguiente para el búfer de entrada.

strstreambuf::p count

Devuelve un recuento del número de elementos que se escriben en la secuencia controlada.

streamsize pcount() const;

Valor devuelto

Un recuento del número de elementos que se escriben en la secuencia controlada.

Comentarios

En concreto, si pptr es un puntero nulo, la función devuelve cero. De lo contrario, devuelve pptr - pbase.

Ejemplo

// 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

Función miembro virtual protegida que trata de modificar las posiciones actuales de las secuencias controladas.

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

Parámetros

_Off
La posición que se va a buscar relativa a _Way.

_Way
El punto de partida de las operaciones de desplazamiento. Vea los valores posibles en seekdir.

_Which
Especifica el modo de la posición del puntero. El valor predeterminado es permitirle modificar las posiciones de lectura y escritura.

Valor devuelto

Si la función modifica correctamente una o las dos posiciones de la secuencia, devuelve la posición de la secuencia resultante. De lo contrario, se produce un error y devuelve una posición de flujo no válida.

Comentarios

La función miembro virtual protegida trata de modificar las posiciones actuales de los flujos controlados. Para un objeto de la clase strstreambuf, una posición de la secuencia consta únicamente de un desplazamiento de la secuencia. El desplazamiento cero designa el primer elemento de la secuencia controlada.

La nueva posición se determina de la siguiente forma:

  • Si _Way == ios_base::beg, la nueva posición es el principio del flujo más _Off.

  • Si _Way == ios_base::cur, la nueva posición es la posición actual del flujo más _Off.

  • Si _Way == ios_base::end, la nueva posición es el final del flujo más _Off.

Si _Which & ios_base::in es distinto de cero y el búfer de entrada existe, la función modifica la siguiente posición de lectura en el búfer de entrada. Si _Which & ios_base::out es de igual forma distinto de cero, _Way != ios_base::cur y existe el búfer de salida, la función establece también la siguiente posición de escritura para que coincida con la siguiente posición de lectura.

De lo contrario, si _Which & ios_base::out es distinto de cero y el búfer de salida existe, la función modifica la siguiente posición de escritura en el búfer de salida. De lo contrario, se produce un error en la operación de posicionamiento. Para que una operación de posicionamiento se realice correctamente, la posición de la secuencia resultante debe encontrarse dentro de la secuencia controlada.

strstreambuf::seekpos

Función miembro virtual protegida que trata de modificar las posiciones actuales de las secuencias controladas.

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

Parámetros

_Sp
La posición que se va a buscar.

_Which
Especifica el modo de la posición del puntero. El valor predeterminado es permitirle modificar las posiciones de lectura y escritura.

Valor devuelto

Si la función modifica correctamente una o las dos posiciones de la secuencia, devuelve la posición de la secuencia resultante. De lo contrario, se produce un error y devuelve una posición de flujo no válida. Para determinar si la posición del flujo no es válida, compare el valor devuelto con pos_type(off_type(-1)).

Comentarios

La función miembro virtual protegida trata de modificar las posiciones actuales de los flujos controlados. Para un objeto de la clase strstreambuf, una posición de la secuencia consta únicamente de un desplazamiento de la secuencia. El desplazamiento cero designa el primer elemento de la secuencia controlada. La nueva posición se determina mediante _Sp.

Si _Which & ios_base::in es distinto de cero y el búfer de entrada existe, la función modifica la siguiente posición para leer en el búfer de entrada. Si _Which & es distinto ios_base::out de cero y el búfer de salida existe, la función también establece la siguiente posición para escribir para que coincida con la siguiente posición que se va a leer. De lo contrario, si _Which & es distinto ios_base::out de cero y el búfer de salida existe, la función modifica la siguiente posición para escribir en el búfer de salida. De lo contrario, se produce un error en la operación de posicionamiento. Para que una operación de posicionamiento se realice correctamente, la posición de la secuencia resultante debe encontrarse dentro de la secuencia controlada.

strstreambuf::str

Llama a freeze y, después, devuelve un puntero al principio de la secuencia controlada.

char *str();

Valor devuelto

Un puntero al principio de la secuencia controlada.

Comentarios

No existe ningún elemento nulo de terminación, a menos que inserte explícitamente uno.

Ejemplo

Vea strstreambuf::freeze para obtener un ejemplo que usa str.

strstreambuf::strstreambuf

Construye un objeto de tipo 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);

Parámetros

alloc_func
La función que se usa para asignar memoria de búfer.

count
Determina la longitud del búfer señalado por getptr. Si getptr no es un argumento (primer formulario constructor), el tamaño de una asignación sugerida para los búferes.

_Freefunc
La función que se usa para liberar memoria de búfer.

getptr
Un búfer que se usa para la entrada.

putptr
Un búfer que se usa para la salida.

Comentarios

El primer constructor almacena un puntero nulo en todos los punteros que controlan el búfer de entrada, el búfer de salida y la asignación de strstreambuf. Establece el modo de strstreambuf almacenado para que la secuencia controlada se pueda modificar y ampliar. También acepta count como el tamaño de asignación inicial sugerido.

El segundo constructor se comporta como el primero, salvo que almacena alloc_func como puntero a la función que se llama para asignar el almacenamiento y free_func como puntero a la función que se llama para liberar el almacenamiento.

Los tres constructores:

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);

También se comportan como el primero, salvo que getptr designa el objeto de matriz que se usa para contener la secuencia controlada. (Por lo tanto, no debe ser un puntero nulo). El número de elementos N de la matriz se determina de la siguiente manera:

  • Si (count> 0), entonces N es count.

  • Si (count == 0), entonces N es strlen((const char *) getptr ).

  • Si (count< 0), entonces N es INT_MAX.

Si putptr es un puntero nulo, la función solo establece un búfer de entrada mediante la ejecución de:

setg(getptr,
    getptr,
    getptr + N);

De lo contrario, establece los búferes de entrada y salida mediante la ejecución de:

setg(getptr,
    getptr,
    putptr);

setp(putptr,
    getptr + N);

En este caso, putptr debe estar en el intervalo [ getptr, getptr + N].

Por último, los tres constructores:

strstreambuf(const char *getptr,
    streamsize count);

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

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

se comportan igual que:

streambuf((char *)getptr, count);

salvo que el modo almacenado hace que la secuencia controlada no se pueda modificar ni ampliar.

strstreambuf::underflow

Función virtual protegida que extrae el elemento actual del flujo de entrada.

virtual int underflow();

Valor devuelto

Si la función no se ejecuta correctamente, devuelve EOF. De lo contrario, devuelve el elemento actual en el flujo de entrada, convertido tal y como se describió anteriormente.

Comentarios

La función miembro virtual protegida intenta extraer el elemento actual ch del búfer de entrada y después avanzar la posición de la secuencia actual y devolver el elemento como (int)(unsigned char)ch. Solo puede hacerlo de una manera: si una posición de lectura está disponible, toma ch como el elemento almacenado en la posición de lectura y avanza el puntero siguiente para el búfer de entrada.

Consulte también

streambuf
Seguridad para subprocesos en la biblioteca estándar de C++
Programación con iostream
Convenciones de iostreams