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

Positioniert den Dateizeiger, falls möglich, an die durch sp angegebene Position. Wenn die zugehörige Datei nicht geöffnet ist ( is_open ( ) == false ), schlägt der Vorgang sofort fehl.

Reposition verhält sich wie folgt:

1) Wenn die Datei zum Schreiben geöffnet ist, schreibt sie den Put-Bereich und alle durch die aktuell eingestellte Locale erforderlichen Unshift-Sequenzen, unter Verwendung von overflow() .
2) Positioniert den Dateizeiger neu, als ob durch Aufruf von std::fsetpos() .
3) Wenn die Datei zum Lesen geöffnet ist, aktualisiert sie den Get-Bereich falls erforderlich.

Wenn sp nicht durch Aufruf von seekoff() oder seekpos() auf derselben Datei erhalten wurde, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Parameter

sp - Dateiposition, erhalten durch seekoff() oder seekpos() , die zuvor auf derselben Datei aufgerufen wurden
which - definiert, welche der Eingabe- und/oder Ausgabesequenzen betroffen sind. Es kann eine oder eine Kombination der folgenden Konstanten sein:
Konstante Erklärung
in beeinflusst die Eingabesequenz
out beeinflusst die Ausgabesequenz

Rückgabewert

sp bei Erfolg oder pos_type ( off_type ( - 1 ) ) bei Misserfolg.

Hinweise

seekpos() wird von std::basic_streambuf::pubseekpos() aufgerufen, welches wiederum von den Einzelargument-Versionen von std::basic_istream::seekg() und std::basic_ostream::seekp() aufgerufen wird.

Viele Implementierungen aktualisieren den Get-Bereich nicht in seekpos() , sondern delegieren an underflow() , der durch den nächsten sgetc() aufgerufen wird.

Beispiel

Bei einigen Implementierungen wird der Get-Bereich durch seekpos() geleert und der zweite underflow() ist notwendig, um die Effekte zu beobachten.

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

Mögliche Ausgabe:

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.

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 55 C++98 seekpos lieferte eine undefinierte
ungültige Stream-Position bei Fehler
pos_type ( off_type ( - 1 ) )
wird bei Fehler zurückgegeben
LWG 171 C++98 die Reihenfolge der Repositionsoperationen war nicht klar wurde klargestellt

Siehe auch

ruft seekpos ( ) auf
(öffentliche Elementfunktion von std::basic_streambuf<CharT,Traits> )
[virtual]
positioniert die Dateiposition neu, unter Verwendung relativer Adressierung
(virtuelle geschützte Elementfunktion)
bewegt den Dateipositionszeiger an eine bestimmte Stelle in einer Datei
(Funktion)