Namespaces
Variants

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

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
std:: ios_base :: seekdir dir,

std:: ios_base :: openmode which = std:: ios_base :: in | std:: ios_base :: out ) ;

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 gptr y/o pptr son reposicionados, se realiza de la siguiente manera:

1) El nuevo desplazamiento del puntero newoff de tipo off_type se determina
a) si dir == std:: ios_base :: beg , entonces newoff es cero
b) si dir == std:: ios_base :: cur , entonces newoff es la posición actual del puntero ( gptr ( ) - eback ( ) o pptr ( ) - pbase ( ) )
c) si dir == std:: ios_base :: end , entonces newoff es la longitud de toda la parte inicializada del búfer (si se utiliza sobreasignación , el puntero de marca de agua alto menos el puntero inicial)
2) Si el puntero a reposicionar es un puntero nulo y newoff sería diferente de cero, esta función falla.
3) Si newoff + off < 0 (el reposicionamiento movería el puntero antes del inicio del búfer) o si newoff + off apuntaría más allá del final del búfer (o más allá del último carácter inicializado en el búfer si se utiliza over-allocation ), la función falla.
4) De lo contrario, el puntero se asigna como si fuera mediante gptr ( ) = eback ( ) + newoff + off o pptr ( ) = pbase ( ) + newoff + off .

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:
Constante Explicación
beg inicio de un flujo
end final de un flujo
cur posición actual del indicador de posición del flujo
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:
Constante Explicación
in afecta la secuencia de entrada
out afecta la secuencia de salida

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 )