Espacios de nombres
Variantes
Acciones

std::basic_stringbuf::overflow

De cppreference.com
< cpp‎ | io‎ | basic stringbuf
 
 
Biblioteca de E/S
Manipuladores de E/S
E/S estilo C
Búferes
(en desuso en C++98)
Flujos
Abstracciones
E/S de archivos
E/S de cadenas
E/S de arrays
(en desuso en C++98)
(en desuso en C++98)
(en desuso en C++98)
Salida sincronizada
Tipos
Interfaz de categoría de error
(C++11)
 
 
protected:
virtual int_type overflow( int_type c = Traits::eof() );

Anexa el carácter c a la secuencia de caracteres de salida.

Si c es el indicador de fin de archivo (traits::eq_int_type(c, traces::eof()) == true), no hay ningún carácter que anexar. La función no hace nada y devuelve un valor no especificado distinto de traits::eof().

De lo contrario, si la secuencia de salida tiene una posición de escritura disponible o esta función puede hacer que una posición de escritura esté disponible, entonces llama a sputc(c) y devuelve c.

Esta función puede hacer que una posición de escritura esté disponible si el std::stringbuf está abierto para salida ((mode & ios_base::out) != 0): en este caso, reasigna (o asigna inicialmente) el búfer lo suficientemente grande como para contener todo el búfer actual, más al menos un carácter más. Si el std::stringbuf también está abierto para entrada ((mode & ios_base::in) != 0), entonces overflow también aumenta el tamaño del área de obtención moviendo egptr() para que apunte justo más allá de la nueva posición de escritura.

Contenido

[editar] Parámetros

c - El carácter que se almacenará en el área de colocación.

[editar] Valor de retorno

Traits::eof() para indicar un error, c si el carácter c se agregó correctamente o algún valor distinto de Traits::eof() si se llama con Traits::eof() como argumento.

[editar] Notas

Esta función es diferente de una función overflow() típica que mueve el contenido del búfer a la secuencia de caracteres asociada porque para un objeto std::basic_stringbuf; el búfer y la secuencia asociada son uno y el mismo.


[editar] Ejemplo

En la implementación utilizada para ejecutar este ejemplo (por ejemplo, GCC-4.9), overflow() sobreasigna el área de colocación a 512 bytes: una llamada a str() solo devolvería los cuatro bytes inicializados, pero las siguientes 508 llamadas a sputc() no requerirían nuevas llamadas a overflow().

#include <sstream>
#include <iostream>
 
struct mybuf : std::stringbuf
{
    mybuf(const std::string& new_str,
          std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)
        : std::stringbuf(new_str, which) {}
 
    int_type overflow(int_type c = EOF) override
    {
        std::cout << "stringbuf::overflow('" << char(c) << "') llamada\n"
                  << "Antes  : tamaño del área de obtención:  " << egptr() - eback() << '\n'
                  << "         tamaño del área de colocación: " << epptr() - pbase() << '\n';
 
        int_type ret = std::stringbuf::overflow(c);
 
        std::cout << "Después: tamaño del área de obtención:  " << egptr() - eback() << '\n'
                  << "         tamaño del área de colocación: " << epptr() - pbase() << '\n';
 
        return ret;
    }
};
 
int main()
{
    std::cout << "flujo de lectura-escritura:\n";
    mybuf sbuf("   "); // flujo de lectura-escritura
    std::iostream stream(&sbuf);
    stream << 1234;
    std::cout << sbuf.str() << '\n';
 
    std::cout << "\nflujo de solo lectura:\n";
    mybuf ro_buf("   ", std::ios_base::in); // flujo de solo lectura
    std::iostream ro_stream(&ro_buf);
    ro_stream << 1234;
 
    std::cout << "\nflujo de solo escritura:\n";
    mybuf wr_buf("   ", std::ios_base::out); // flujo de solo escritura
    std::iostream wr_stream(&wr_buf);
    wr_stream << 1234;
}

Posible salida:

flujo de lectura-escritura:
stringbuf::overflow('4') llamada
Antes  : tamaño del área de obtención:  3
         tamaño del área de colocación: 3
Después: tamaño del área de obtención:  4
         tamaño del área de colocación: 512
1234
 
flujo de solo lectura:
stringbuf::overflow('1') llamada
Antes  : tamaño del área de obtención:  3
         tamaño del área de colocación: 0
Después: tamaño del área de obtención:  3
         tamaño del área de colocación: 0
 
flujo de solo escritura:
stringbuf::overflow('4') llamada
Antes  : tamaño del área de obtención:  0
         tamaño del área de colocación: 3
Después: tamaño del área de obtención:  0
         tamaño del área de colocación: 512

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
LWG 169 C++98 El búfer (re)asignado solo podía contener un carácter adicional. Permite más caracteres adicionales.
LWG 432 C++98 overflow movía epptr() para que apuntara justo después de
la nueva posición de escritura si std::stringbuf estaba abierto para entrada.
No se mueve.

[editar] Véase también

[virtual]
Escribe los caracteres del área de colocación a la secuencia de salida asociada.
(función miembro virtual protegida de std::basic_streambuf<CharT,Traits>) [editar]
[virtual]
Devuelve el siguiente carácter disponible en la secuencia de entrada.
(función miembro virtual protegida) [editar]