std::basic_stringbuf<CharT,Traits,Allocator>:: seekoff
|
protected
:
virtual
pos_type seekoff
(
off_type off,
|
||
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 std::ios_base::in et que ce tampon est ouvert en lecture (c'est-à-dire si ( which & std:: ios_base :: in ) == std:: ios_base :: in ), alors repositionne le pointeur de lecture std::basic_streambuf::gptr dans la zone de lecture comme décrit ci-dessous
- Si which inclut std::ios_base::out et que ce tampon est ouvert en écriture (c'est-à-dire si ( which & std:: ios_base :: out ) == std:: ios_base :: out ), alors repositionne le pointeur d'écriture std::basic_streambuf::pptr dans la zone d'écriture comme décrit ci-dessous
- Si which inclut à la fois std::ios_base::in et std::ios_base::out et que le tampon est ouvert en lecture et écriture (c'est-à-dire si ( which & ( std:: ios_base :: in | std:: ios_base :: out ) ) == ( std:: ios_base :: in | std:: ios_base :: out ) ), et que dir est soit std::ios_base::beg soit std::ios_base::end , alors repositionne à la fois les pointeurs de lecture et d'écriture comme décrit ci-dessous.
- Sinon, cette fonction échoue.
Si gptr et/ou pptr sont repositionnés, cela est effectué comme suit :
off_type
est déterminé
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 :
|
||||||||
| 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 :
|
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
)
|