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 ) ;

Repositionne le pointeur de fichier, si possible, à la position indiquée par sp . Si le fichier associé n'est pas ouvert ( is_open ( ) == false ), échoue immédiatement.

Le repositionnement s'effectue comme suit :

1) Si le fichier est ouvert en écriture, écrit la zone de put et toute séquence unshift requise par les paramètres régionaux actuellement imbriqués, en utilisant overflow() .
2) Repositionne le pointeur de fichier, comme en appelant std::fsetpos() .
3) Si le fichier est ouvert en lecture, met à jour la zone de lecture si nécessaire.

Si sp n'a pas été obtenu en appelant seekoff() ou seekpos() sur le même fichier, le comportement est indéfini.

Table des matières

Paramètres

sp - position de fichier obtenue par seekoff() ou seekpos() appelée précédemment sur le même fichier
which - définit quelle(s) séquence(s) d'entrée et/ou de sortie affecter. Il peut s'agir d'une ou d'une combinaison des constantes suivantes :
Constante Explication
in affecte la séquence d'entrée
out affecte la séquence de sortie

Valeur de retour

sp en cas de succès ou pos_type ( off_type ( - 1 ) ) en cas d'échec.

Notes

seekpos() est appelée par std::basic_streambuf::pubseekpos() , qui est appelée par les versions à un seul argument de std::basic_istream::seekg() et std::basic_ostream::seekp() .

De nombreuses implémentations ne mettent pas à jour la zone get dans seekpos() , déléguant à underflow() qui est appelé par le prochain sgetc() .

Exemple

Sur certaines implémentations, la zone de lecture est vidée par seekpos() et le second appel à underflow() est nécessaire pour observer les effets.

#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);
}

Sortie possible :

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.

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 55 C++98 seekpos renvoyait une position de flux
invalide non définie en cas d'échec
pos_type ( off_type ( - 1 ) )
est renvoyé en cas d'échec
LWG 171 C++98 la séquence des opérations de repositionnement n'était pas claire clarifiée

Voir aussi

appelle seekpos ( )
(fonction membre publique de std::basic_streambuf<CharT,Traits> )
[virtual]
repositionne la position dans le fichier, en utilisant l'adressage relatif
(fonction membre protégée virtuelle)
déplace l'indicateur de position du fichier vers un emplacement spécifique
(fonction)