Namespaces
Variants

std::basic_stringbuf<CharT,Traits,Allocator>:: overflow

From cppreference.net
protected :
virtual int_type overflow ( int_type c = Traits :: eof ( ) ) ;

Añade 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, traits :: eof ( ) ) == true ), entonces no hay ningún carácter que añadir. 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 exitosamente disponible una posición de escritura, entonces llama a sputc ( c ) y retorna c .

Esta función puede hacer disponible una posición de escritura 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 para contener todo el búfer actual más al menos un carácter adicional. Si el std::stringbuf también está abierto para entrada ( ( mode & ios_base :: in ) ! = 0 ), entonces overflow también incrementa el tamaño del área de obtención moviendo egptr() para apuntar justo después de la nueva posición de escritura.

Contenidos

Parámetros

c - el carácter a almacenar en el área de put

Valor de retorno

Traits :: eof ( ) para indicar fallo, c si el carácter c fue añadido exitosamente, o algún valor diferente de Traits :: eof ( ) si se llamó con Traits :: eof ( ) como argumento.

Notas

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


Ejemplo

En la implementación utilizada para ejecutar este ejemplo (por ejemplo, GCC-4.9), overflow() asigna en exceso el área de escritura 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) << "') called\n"
                  << "Before: size of get area: " << egptr() - eback() << '\n'
                  << "        size of put area: " << epptr() - pbase() << '\n';
        int_type ret = std::stringbuf::overflow(c);
        std::cout << "After : size of get area: " << egptr() - eback() << '\n'
                  << "        size of put area: " << epptr() - pbase() << '\n';
        return ret;
    }
};
int main()
{
    std::cout << "read-write stream:\n";
    mybuf sbuf("   "); // read-write stream
    std::iostream stream(&sbuf);
    stream << 1234;
    std::cout << sbuf.str() << '\n';
    std::cout << "\nread-only stream:\n";
    mybuf ro_buf("   ", std::ios_base::in); // read-only stream
    std::iostream ro_stream(&ro_buf);
    ro_stream << 1234;
    std::cout << "\nwrite-only stream:\n";
    mybuf wr_buf("   ", std::ios_base::out); // write-only stream
    std::iostream wr_stream(&wr_buf);
    wr_stream << 1234;
}

Salida posible:

read-write stream:
stringbuf::overflow('4') called
Before: size of get area: 3
        size of put area: 3
After : size of get area: 4
        size of put area: 512
1234
read-only stream:
stringbuf::overflow('1') called
Before: size of get area: 3
        size of put area: 0
After : size of get area: 3
        size of put area: 0
write-only stream:
stringbuf::overflow('4') called
Before: size of get area: 0
        size of put area: 3
After : size of get area: 0
        size of put area: 512

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento 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 apuntar justo después de la nueva
posición de escritura si el std::stringbuf está abierto para entrada
no se mueve

Véase también

[virtual]
escribe caracteres a la secuencia de salida asociada desde el área de escritura
(función miembro protegida virtual de std::basic_streambuf<CharT,Traits> )
[virtual]
devuelve el siguiente carácter disponible en la secuencia de entrada
(función miembro protegida virtual)