Namespaces
Variants

std::basic_streambuf<CharT,Traits>:: underflow

From cppreference.net
protected :
virtual int_type underflow ( ) ;

Stellt sicher, dass mindestens ein Zeichen im Eingabebereich verfügbar ist, indem die Zeiger auf den Eingabebereich aktualisiert werden (falls erforderlich) und weitere Daten aus der Eingabesequenz gelesen werden (falls zutreffend). Gibt den Wert dieses Zeichens (konvertiert zu int_type mit Traits :: to_int_type ( c ) ) bei Erfolg zurück oder Traits :: eof ( ) bei Fehler.

Die Funktion kann die gptr -, egptr - und eback -Zeiger aktualisieren, um den Speicherort neu geladener Daten (falls vorhanden) zu definieren. Bei einem Fehler stellt die Funktion sicher, dass entweder gptr ( ) == nullptr oder gptr ( ) == egptr .

Die Basisklassenversion der Funktion tut nichts. Die abgeleiteten Klassen können diese Funktion überschreiben, um Aktualisierungen des Abrufbereichs im Falle von Erschöpfung zu ermöglichen.

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

Der Wert des Zeichens, auf das der get pointer nach dem erfolgreichen Aufruf zeigt, oder Traits :: eof ( ) andernfalls.

Die Basisklassenversion der Funktion gibt traits :: eof ( ) zurück.

Hinweis

Die öffentlichen Funktionen von std::streambuf rufen diese Funktion nur auf, wenn gptr ( ) == nullptr oder gptr ( ) >= egptr ( ) .

Beispiel

#include <iostream>
#include <sstream>
class null_filter_buf : public std::streambuf
{
    std::streambuf* src;
    char ch; // single-byte buffer
protected:
    int underflow()
    {
        traits_type::int_type i;
        while ((i = src->sbumpc()) == '\0')
            ; // skip zeroes
        if (!traits_type::eq_int_type(i, traits_type::eof()))
        {
            ch = traits_type::to_char_type(i);
            setg(&ch, &ch, &ch+1); // make one read position available
        }
        return i;
    }
public:
    null_filter_buf(std::streambuf* buf) : src(buf)
    {
        setg(&ch, &ch + 1, &ch + 1); // buffer is initially full
    }
};
void filtered_read(std::istream& in)
{
    std::streambuf* orig = in.rdbuf();
    null_filter_buf buf(orig);
    in.rdbuf(&buf);
    for (char c; in.get(c);)
        std::cout << c;
    in.rdbuf(orig);
}
int main()
{
    char a[] = "This i\0s \0an e\0\0\0xample";
    std::istringstream in(std::string(std::begin(a), std::end(a)));
    filtered_read(in);
}

Ausgabe:

This is an example

Siehe auch

[virtual]
Liest Zeichen aus der zugehörigen Eingabesequenz in den Get-Bereich und bewegt den Next-Zeiger vorwärts
(virtuelle geschützte Elementfunktion)
[virtual]
Schreibt Zeichen aus dem Put-Bereich in die zugehörige Ausgabesequenz
(virtuelle geschützte Elementfunktion)
[virtual]
Liest aus der zugehörigen Datei
(virtuelle geschützte Elementfunktion von std::basic_filebuf<CharT,Traits> )
[virtual]
Gibt das nächste in der Eingabesequenz verfügbare Zeichen zurück
(virtuelle geschützte Elementfunktion von std::basic_stringbuf<CharT,Traits,Allocator> )
[virtual]
Liest ein Zeichen aus der Eingabesequenz ohne Bewegung des Next-Zeigers
(virtuelle geschützte Elementfunktion von std::strstreambuf )