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.
Parámetros
| c | - | El carácter que se almacenará en el área de colocación. |
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.
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.
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
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. |
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) |