Namensräume
Varianten
Aktionen

std::basic_streambuf<CharT,Traits>:underflow

Von cppreference.com
< cpp‎ | io‎ | basic streambuf
 
 
 
 
protected:
virtual int_type underflow();

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

Die Funktion kann die Zeiger gptr, egptr und eback aktualisieren, um die Position 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 Get-Bereichs im Falle der Erschöpfung zu ermöglichen.

Inhalt

[bearbeiten] Parameter

(keine)

[bearbeiten] Rückgabewert

Der Wert des Zeichens, auf das nach dem Aufruf vom *Get-Zeiger* gezeigt wird, bei Erfolg oder Traits::eof() andernfalls.

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

[bearbeiten] Hinweis

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

[bearbeiten] 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

[bearbeiten] Siehe auch

[virtuell]
liest Zeichen aus der zugeordneten Eingabesequenz in den Get-Bereich und rückt den nächsten Zeiger vor
(virtuelle geschützte Memberfunktion) [bearbeiten]
[virtuell]
schreibt Zeichen aus dem Put-Bereich in die zugeordnete Ausgabesequenz
(virtuelle geschützte Memberfunktion) [bearbeiten]
[virtuell]
liest aus der zugeordneten Datei
(virtuelle protected Memberfunktion von std::basic_filebuf<CharT,Traits>) [bearbeiten]
[virtuell]
gibt das nächste in der Eingabesequenz verfügbare Zeichen zurück
(virtuelle protected Memberfunktion von std::basic_stringbuf<CharT,Traits,Allocator>) [bearbeiten]
[virtuell]
liest ein Zeichen aus der Eingabesequenz, ohne den Zeiger auf das nächste Zeichen vorzuschieben
(virtuelle protected Memberfunktion von std::strstreambuf) [bearbeiten]