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

Repositionne std::basic_streambuf::gptr et/ou std::basic_streambuf::pptr , si possible, à la position correspondant exactement à off caractères depuis le début, la fin ou la position actuelle de la zone de lecture et/ou d'écriture du tampon.

Si gptr et/ou pptr sont repositionnés, cela est effectué comme suit :

1) Le nouvel offset du pointeur newoff de type off_type est déterminé
a) si dir == std:: ios_base :: beg , alors newoff est zéro
b) si dir == std:: ios_base :: cur , alors newoff est la position actuelle du pointeur ( gptr ( ) - eback ( ) ou pptr ( ) - pbase ( ) )
c) si dir == std:: ios_base :: end , alors newoff est la longueur de la partie initialisée entière du tampon (si la sur-allocation est utilisée, le pointeur de niveau haut moins le pointeur de début)
2) Si le pointeur à repositionner est un pointeur nul et newoff serait non nul, cette fonction échoue.
3) Si newoff + off < 0 (le repositionnement déplacerait le pointeur avant le début du tampon) ou si newoff + off pointerait au-delà de la fin du tampon (ou au-delà du dernier caractère initialisé dans le tampon si la sur-allocation est utilisée), la fonction échoue.
4) Sinon, le pointeur est assigné comme si par gptr ( ) = eback ( ) + newoff + off ou pptr ( ) = pbase ( ) + newoff + off .

Table des matières

Paramètres

off - position relative pour définir le(s) pointeur(s) suivant(s)
dir - définit la position de base à laquelle appliquer le décalage relatif. Il peut s'agir d'une des constantes suivantes :
Constante Explication
beg le début d'un flux
end la fin d'un flux
cur la position actuelle de l'indicateur de position du flux
which - définit si la séquence d'entrée, la séquence de sortie, ou les deux sont affectées. 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

pos_type ( newoff ) en cas de succès, pos_type ( off_type ( - 1 ) ) en cas d'échec ou si pos_type ne peut pas représenter la position du flux résultante.

Exemple

#include <iostream>
#include <sstream>
int main()
{
    std::stringstream ss("123"); // entrée/sortie
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // positionnement absolu des deux pointeurs
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // déplacer les deux de 1 vers l'avant
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // tentative de déplacement des deux pointeurs de 1 depuis la position actuelle
    if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur))
        std::cout << "le déplacement des deux pointeurs depuis la position actuelle a échoué\n";
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // déplacer le pointeur d'écriture de 1 vers l'avant, mais pas le pointeur de lecture
    // peut aussi être appelé comme 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'; // écrire à la position put
    std::cout << "Écrit 'a' à la position put, le buffer est maintenant " << ss.str() << '\n';
    char ch;
    ss >> ch;
    std::cout << "la lecture à la position get donne '" << ch << "'\n";
}

Sortie :

put pos = 0 get pos = 0
put pos = 1 get pos = 1
moving both pointers from current position failed
put pos = 1 get pos = 1
put pos = 2 get pos = 1
Wrote 'a' at put position, the buffer is now 12a
reading at get position gives '2'

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 Appliqué à Comportement publié Comportement corrigé
LWG 55 C++98 seekoff retournait une position de flux
invalide non définie en cas d'échec
pos_type ( off_type ( - 1 ) )
est retourné en cas d'échec
LWG 375 C++98 les membres constants statiques de std::ios_base étaient
incorrectement spécifiés comme membres de std::basic_ios
corrigé
LWG 432 C++98 seekoff pouvait réussir même si newoff + off
pointerait au-delà du dernier caractère initialisé
seekoff échoue
dans ce cas
LWG 453 C++98 le repositionnement de gptr ( ) null et/ou de pptr ( )
null avec un nouvel offset de zéro échouait toujours
il peut réussir dans ce cas
LWG 563 C++98 le pointeur de fin ne pouvait pas être utilisé pour calculer newoff car il ne pouvait
pas être précisément contrôlé par le programme après la résolution de LWG issue 432
utiliser le pointeur de
niveau haut d'eau à la place

Voir aussi

appelle seekoff ( )
(fonction membre publique de std::basic_streambuf<CharT,Traits> )
[virtual]
repositionne le pointeur suivant dans la séquence d'entrée, la séquence de sortie, ou les deux en utilisant l'adressage absolu
(fonction membre protégée virtuelle)
[virtual]
repositionne la position du fichier, en utilisant l'adressage relatif
(fonction membre protégée virtuelle de std::basic_filebuf<CharT,Traits> )
[virtual]
repositionne le pointeur suivant dans la séquence d'entrée, la séquence de sortie, ou les deux, en utilisant l'adressage relatif
(fonction membre protégée virtuelle de std::strstreambuf )