std::basic_stringbuf<CharT,Traits,Allocator>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
Reposiciona std::basic_streambuf::gptr y/o std::basic_streambuf::pptr , si es posible, a la posición que corresponde exactamente a off caracteres desde el inicio, final o posición actual del área de lectura y/o escritura del buffer.
- Si which incluye std::ios_base::in y este búfer está abierto para lectura (es decir, si ( which & std:: ios_base :: in ) == std:: ios_base :: in ), entonces reposiciona el puntero de lectura std::basic_streambuf::gptr dentro del área de obtención como se describe a continuación
- Si which incluye std::ios_base::out y este búfer está abierto para escritura (es decir, ( which & std:: ios_base :: out ) == std:: ios_base :: out ), entonces reposiciona el puntero de escritura std::basic_streambuf::pptr dentro del área de colocación como se describe a continuación
- Si which incluye tanto std::ios_base::in como std::ios_base::out y el búfer está abierto tanto para lectura como para escritura (es decir, ( which & ( std:: ios_base :: in | std:: ios_base :: out ) ) == ( std:: ios_base :: in | std:: ios_base :: out ) ), y dir es std::ios_base::beg o std::ios_base::end , entonces reposiciona tanto el puntero de lectura como el de escritura como se describe a continuación.
- De lo contrario, esta función falla.
Si gptr y/o pptr son reposicionados, se realiza de la siguiente manera:
off_type
se determina
Contenidos |
Parámetros
| off | - | posición relativa para establecer el/los siguiente(s) puntero(s) | ||||||||
| dir | - |
define la posición base para aplicar el desplazamiento relativo. Puede ser una de las siguientes constantes:
|
||||||||
| which | - |
define si se ven afectadas las secuencias de entrada, la secuencia de salida, o ambas. Puede ser una o una combinación de las siguientes constantes:
|
Valor de retorno
pos_type
(
newoff
)
en caso de éxito,
pos_type
(
off_type
(
-
1
)
)
en caso de fallo o si
pos_type
no puede representar la posición resultante en el flujo.
Ejemplo
#include <iostream> #include <sstream> int main() { std::stringstream ss("123"); // entrada/salida std::cout << "pos put = " << ss.tellp() << " pos get = " << ss.tellg() << '\n'; // posicionamiento absoluto de ambos punteros ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // mover ambos 1 hacia adelante std::cout << "pos put = " << ss.tellp() << " pos get = " << ss.tellg() << '\n'; // intentar mover ambos punteros 1 hacia adelante desde la posición actual if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur)) std::cout << "mover ambos punteros desde la posición actual falló\n"; std::cout << "pos put = " << ss.tellp() << " pos get = " << ss.tellg() << '\n'; // mover el puntero de escritura 1 hacia adelante, pero no el de lectura // también puede llamarse como ss.seekp(1, std::ios_base::cur); ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out); std::cout << "pos put = " << ss.tellp() << " pos get = " << ss.tellg() << '\n'; ss << 'a'; // escribir en la posición put std::cout << "Se escribió 'a' en la posición put, el buffer ahora es " << ss.str() << '\n'; char ch; ss >> ch; std::cout << "leer en la posición get da '" << ch << "'\n"; }
Salida:
pos put = 0 pos get = 0 pos put = 1 pos get = 1 mover ambos punteros desde la posición actual falló pos put = 1 pos get = 1 pos put = 2 pos get = 1 Se escribió 'a' en la posición put, el buffer ahora es 12a leer en la posición get da '2'
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 55 | C++98 |
seekoff
retornaba una posición de flujo
inválida indefinida en caso de fallo |
pos_type
(
off_type
(
-
1
)
)
se retorna en caso de fallo |
| LWG 375 | C++98 |
los miembros constantes estáticos de
std::ios_base
estaban
mal especificados como miembros de std::basic_ios |
corregido |
| LWG 432 | C++98 |
seekoff
podría tener éxito incluso si
newoff
+
off
apuntaría más allá del último carácter inicializado |
seekoff
falla
en este caso |
| LWG 453 | C++98 |
el reposicionamiento de
gptr
(
)
nulo y/o
pptr
(
)
nulo
con un nuevo desplazamiento de cero siempre fallaba |
puede tener éxito en este caso |
| LWG 563 | C++98 |
el puntero final no podía usarse para calcular
newoff
porque no podía
ser controlado con precisión por el programa tras resolver LWG issue 432 |
usar el puntero de marca de agua
alta en su lugar |
Véase también
|
invoca
seekoff
(
)
(función miembro pública de
std::basic_streambuf<CharT,Traits>
)
|
|
|
[virtual]
|
reposiciona el siguiente puntero en la secuencia de entrada, secuencia de salida, o ambas usando direccionamiento absoluto
(función miembro protegida virtual) |
|
[virtual]
|
reposiciona la posición del archivo, usando direccionamiento relativo
(función miembro protegida virtual de
std::basic_filebuf<CharT,Traits>
)
|
|
[virtual]
|
reposiciona el siguiente puntero en la secuencia de entrada, secuencia de salida, o ambas, usando direccionamiento relativo
(función miembro protegida virtual de
std::strstreambuf
)
|