Namespaces
Variants

std::basic_filebuf<CharT,Traits>:: 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 le pointeur de fichier, si possible, à la position qui correspond exactement à off caractères depuis le début, la fin ou la position actuelle du fichier (en fonction de la valeur de dir ).

Si le fichier associé n'est pas ouvert ( is_open ( ) == false ), échoue immédiatement.

Si l'encodage des caractères multioctets dépend de l'état ( codecvt::encoding() a retourné - 1 ) ou à longueur variable ( codecvt::encoding() a retourné 0 ) et que l'offset off n'est pas 0 , échoue immédiatement : cette fonction ne peut pas déterminer le nombre d'octets correspondant à off caractères.

Si dir n'est pas std::basic_ios::cur ou si le décalage off n'est pas 0 , et que l'opération la plus récente effectuée sur cet objet filebuf était une sortie (c'est-à-dire que le tampon de sortie n'est pas vide, ou que la fonction appelée le plus récemment était overflow() ), alors appelle std :: codecvt :: unshift pour déterminer la séquence de décalage nécessaire, et écrit cette séquence dans le fichier en appelant overflow() .

Convertit ensuite l'argument dir en une valeur whence de type int comme suit :

valeur de dir valeur de whence
std :: basic_ios :: beg SEEK_SET
std :: basic_ios :: end SEEK_END
std :: basic_ios :: cur SEEK_CUR

Ensuite, si l'encodage des caractères est à largeur fixe ( codecvt::encoding() retourne un nombre positif width ), déplace le pointeur de fichier comme par std:: fseek ( file, width * off, whence ) .

Sinon, déplace le pointeur de fichier comme si par std:: fseek ( file, 0 , whence ) .

L'argument openmode , requis par la signature de la fonction de la classe de base, est généralement ignoré, car std::basic_filebuf ne maintient qu'une seule position de fichier.

Table des matières

Paramètres

off - position relative à laquelle définir l'indicateur de position
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 quelles séquences 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

Un objet nouvellement construit de type pos_type qui stocke la position de fichier résultante, ou pos_type ( off_type ( - 1 ) ) en cas d'échec.

Notes

seekoff() est appelée par std :: basic_streambuf :: pubseekoff , qui est appelée par std :: basic_istream :: seekg , std :: basic_ostream :: seekp , std :: basic_istream :: tellg , et std :: basic_ostream :: tellp .

Exemple

#include <fstream>
#include <iostream>
#include <locale>
template<typename CharT>
int get_encoding(const std::basic_istream<CharT>& stream)
{
    using Facet = std::codecvt<CharT, char, std::mbstate_t>;
    return std::use_facet<Facet>(stream.getloc()).encoding();
}
int main()
{
    // prépare un fichier de 10 octets contenant 4 caractères ("zß水𝄋") en UTF-8
    std::ofstream("text.txt") << "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    // ouvre en utilisant un encodage non-convertissant
    std::ifstream f1("text.txt");
    std::cout << "L'encoding() du locale de f1 retourne "
              << get_encoding(f1) << '\n'
              << "pubseekoff(3, beg) retourne "
              << f1.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
              << "pubseekoff(0, end) retourne "
              << f1.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
    // ouvre en utilisant UTF-8
    std::wifstream f2("text.txt");
    f2.imbue(std::locale("en_US.UTF-8"));
    std::cout << "L'encoding() du locale de f2 retourne "
              << get_encoding(f2) << '\n'
              << "pubseekoff(3, beg) retourne "
              << f2.rdbuf()->pubseekoff(3, std::ios_base::beg) << '\n'
              << "pubseekoff(0, end) retourne "
              << f2.rdbuf()->pubseekoff(0, std::ios_base::end) << '\n';
}

Sortie :

L'encoding() du locale de f1 retourne 1
pubseekoff(3, beg) retourne 3
pubseekoff(0, end) retourne 10
L'encoding() du locale de f2 retourne 0
pubseekoff(3, beg) retourne -1
pubseekoff(0, end) retourne 10

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

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