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 ) ;
(obsolète en C++98)
(supprimé en C++26)

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 which inclut ios_base :: in et que ce tampon est ouvert en lecture, repositionne alors le pointeur de lecture std::basic_streambuf::gptr dans la zone de réception comme décrit ci-dessous.
  • Si which inclut ios_base :: out et que ce tampon est ouvert en écriture, repositionne alors le pointeur d'écriture std::basic_streambuf::pptr dans la zone d'émission comme décrit ci-dessous.
  • Si which inclut à la fois ios_base :: in et ios_base::out et que le tampon est ouvert en lecture et écriture, et que way est soit ios_base :: beg soit ios_base :: end , repositionne alors les pointeurs de lecture et d'écriture comme décrit ci-dessous.
  • Sinon, cette fonction échoue.

Si le pointeur (soit gptr ou pptr ou les deux) est repositionné, cela est effectué comme suit :

1) Si le pointeur à repositionner est un pointeur nul et que le nouveau décalage newoff serait non nul, cette fonction échoue.
2) Le nouvel offset du pointeur newoff de type off_type est déterminé
a) si way == ios_base :: beg , alors newoff est zéro
b) si way == ios_base :: cur , alors newoff est la position actuelle du pointeur ( gptr ( ) - eback ( ) ou pptr ( ) - pbase ( ) )
c) si way == ios_base :: end , alors newoff est la longueur de la partie initialisée entière du tampon (si la surallocation est utilisée, le pointeur de niveau haut moins le pointeur de début)
3) Si newoff + off est négatif ou dépasse les limites de la partie initialisée du tampon, 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) prochain(s) pointeur(s)
way - 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 et si pos_type ne peut pas représenter la position du flux résultante.

Exemple

#include <iostream>
#include <strstream>
int main()
{
    char a[] = "123";
    std::strstream ss(a, sizeof a); // in/out
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // absolute positioning both pointers
    ss.rdbuf()->pubseekoff(1, std::ios_base::beg); // move both forward
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // try to move both pointers 1 forward from current position
    if (-1 == ss.rdbuf()->pubseekoff(1, std::ios_base::cur))
        std::cout << "moving both pointers from current position failed\n";
    std::cout << "put pos = " << ss.tellp()
              << " get pos = " << ss.tellg() << '\n';
    // move the write pointer 1 forward, but not the read pointer
    // can also be called as 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'; // write at put position
    std::cout << "Wrote 'a' at put position, the buffer is now: '";
    std::cout.write(a, sizeof a);
    std::cout << "'\n";
    char ch;
    ss >> ch;
    std::cout << "reading at get position gives '" << 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 renvoyait une position de flux
invalide non définie en cas d'échec
pos_type ( off_type ( - 1 ) )
est renvoyé en cas d'échec

Voir aussi

[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 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::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 relatif
(fonction membre protégée virtuelle de std::basic_stringbuf<CharT,Traits,Allocator> )
[virtual]
repositionne la position du fichier en utilisant l'adressage relatif
(fonction membre protégée virtuelle de std::basic_filebuf<CharT,Traits> )