std::basic_stringbuf::overflow
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 dela 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> )
|
[virtual] |
Devuelve el siguiente carácter disponible en la secuencia de entrada. (función miembro virtual protegida) |