Namespaces
Variants

std::strstreambuf:: seekoff

From cppreference.net
protected :

virtual pos_type seekoff ( off_type off,
ios_base :: seekdir way,

ios_base :: openmode which = ios_base :: in | ios_base :: out ) ;
(obsoleto en C++98)
(eliminado en C++26)

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 ios_base :: in y este búfer está abierto para lectura, 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 ios_base :: out y este búfer está abierto para escritura, 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 ios_base :: in como ios_base::out y el búfer está abierto tanto para lectura como escritura, y way es ya sea ios_base :: beg o 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 el puntero (ya sea gptr o pptr o ambos) es reposicionado, se realiza de la siguiente manera:

1) Si el puntero a reposicionar es un puntero nulo y el nuevo desplazamiento newoff sería diferente de cero, esta función falla.
2) El nuevo desplazamiento del puntero newoff de tipo off_type se determina
a) si way == ios_base :: beg , entonces newoff es cero
b) si way == ios_base :: cur , entonces newoff es la posición actual del puntero ( gptr ( ) - eback ( ) o pptr ( ) - pbase ( ) )
c) si way == 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 alta menos el puntero inicial)
3) Si newoff + off es negativo o está fuera de los límites de la parte inicializada del búfer, 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)
way - define la posición base para aplicar el desplazamiento relativo. Puede ser una de las siguientes constantes:
Constante Explicación
beg el inicio de un flujo
end el final de un flujo
cur la posición actual del indicador de posición del flujo
which - define si se ve afectada la secuencia 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 y si pos_type no puede representar la posición resultante en el flujo.

Ejemplo

#include <iostream>
#include <strstream>
int main()
{
    char a[] = "123";
    std::strstream ss(a, sizeof a); // entrada/salida
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // posicionamiento absoluto de ambos punteros
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // mover ambos hacia adelante
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // intentar mover ambos punteros 1 posición 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 << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // mover el puntero de escritura 1 hacia adelante, pero no el puntero de lectura
    // también se puede llamar como ss.seekp(1, std::ios_base::cur);
    ss.rdbuf()->pubseekoff(1, std::ios_base::cur, std::ios_base::out);
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << 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: '";
    std::cout.write(a, sizeof a);
    std::cout << "'\n";
    char ch;
    ss >> ch;
    std::cout << "la lectura en la posición get da '" << ch << "'\n";
}

Salida:

put pos = 0 get pos = 0
put pos = 1 get pos = 1
mover ambos punteros desde la posición actual falló
put pos = 1 get pos = 1
put pos = 2 get pos = 1
Se escribió 'a' en la posición put, el buffer ahora es: '12a'
la lectura 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

Véase también

[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 el siguiente puntero en la secuencia de entrada, secuencia de salida, o ambas, usando direccionamiento relativo
(función miembro protegida virtual de std::basic_streambuf<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::basic_stringbuf<CharT,Traits,Allocator> )
[virtual]
reposiciona la posición del archivo, usando direccionamiento relativo
(función miembro protegida virtual de std::basic_filebuf<CharT,Traits> )