std::basic_stringbuf<CharT,Traits,Allocator>:: overflow
|
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) |