Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: seekpos

From cppreference.net
protected :

virtual pos_type seekpos ( pos_type sp,

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

Reposiciona el puntero del archivo, si es posible, a la posición indicada por sp . Si el archivo asociado no está abierto ( is_open ( ) == false ), falla inmediatamente.

Reposition se realiza de la siguiente manera:

1) Si el archivo está abierto para escritura, escribe el área de put y cualquier secuencia unshift requerida por la configuración regional actualmente imbucida, usando overflow() .
2) Reposiciona el puntero del archivo, como si se llamara a std::fsetpos() .
3) Si el archivo está abierto para lectura, actualiza el área de obtención si es necesario.

Si sp no fue obtenido llamando a seekoff() o seekpos() en el mismo archivo, el comportamiento es indefinido.

Contenidos

Parámetros

sp - posición de archivo obtenida por seekoff() o seekpos() llamado anteriormente en el mismo archivo
which - define cuál de las secuencias de entrada y/o salida afectar. Puede ser una o una combinación de las siguientes constantes:
Constante Explicación
in afectar la secuencia de entrada
out afectar la secuencia de salida

Valor de retorno

sp en caso de éxito o pos_type ( off_type ( - 1 ) ) en caso de fallo.

Notas

seekpos() es llamado por std::basic_streambuf::pubseekpos() , que es llamado por las versiones de un solo argumento de std::basic_istream::seekg() y std::basic_ostream::seekp() .

Muchas implementaciones no actualizan el área de obtención en seekpos() , delegando a underflow() que es llamado por el siguiente sgetc() .

Ejemplo

En algunas implementaciones, el área de obtención se vacía mediante seekpos() y es necesario un segundo underflow() para observar los efectos.

#include <fstream>
#include <iostream>
struct mybuf : std::filebuf
{
    pos_type seekpos(pos_type sp, std::ios_base::openmode which)
    {
        std::cout << "Before seekpos(" << sp << "), size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";
        pos_type rc = std::filebuf::seekpos(sp, which);
        std::cout << "seekpos() returns " << rc << ".\nAfter the call, "
                  << "size of the get area is "
                  << egptr() - eback() << " with "
                  << egptr() - gptr() << " read positions available.\n";
// uncomment if get area is emptied by seekpos()
//        std::filebuf::underflow();
//        std::cout << "after forced underflow(), size of the get area is "
//                  << egptr() - eback() << " with "
//                  << egptr() - gptr() << " read positions available.\n";
        return rc;
    }
};
int main()
{
    mybuf buf;
    buf.open("test.txt", std::ios_base::in);
    std::istream stream(&buf);
    stream.get(); // read one char to force underflow()
    stream.seekg(2);
}

Salida posible:

Before seekpos(2), size of the get area is 110 with 109 read positions available.
seekpos() returns 2.
After the call, size of the get area is 110 with 108 read positions available.

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 55 C++98 seekpos 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 171 C++98 la secuencia de operaciones de reposicionamiento no era clara se aclaró

Véase también

invoca seekpos ( )
(función miembro pública de std::basic_streambuf<CharT,Traits> )
[virtual]
reposiciona la posición del archivo, usando direccionamiento relativo
(función miembro protegida virtual)
mueve el indicador de posición del archivo a una ubicación específica en un archivo
(función)