Namespaces
Variants

std::basic_stringbuf<CharT,Traits,Allocator>:: underflow

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

Liest das nächste Zeichen aus dem Get-Bereich des Puffers.

Konkret:

1) Wenn die Eingabesequenz eine Leseposition verfügbar hat ( egptr ( ) > gptr ( ) ), gibt Traits :: to_int_type ( * gptr ( ) ) zurück
2) Andernfalls, falls pptr ( ) > egptr ( ) (einige Zeichen wurden seit dem letzten Mal, als overflow() den egptr() geändert hat, in den Stream eingefügt), dann erweitert das Ende des Lesebereichs, um die zuletzt eingefügten Zeichen einzubeziehen, indem egptr() geändert wird, um gleich pptr() zu sein, und gibt dann Traits :: to_int_type ( * gptr ( ) ) zurück.
3) Andernfalls wird Traits :: eof ( ) zurückgegeben.

Jedes Zeichen im Puffer, das initialisiert wurde, unabhängig davon, ob es ursprünglich aus dem im Konstruktor übergebenen String stammt oder durch overflow() angehängt wurde, wird als Teil der Eingabesequenz betrachtet.

Inhaltsverzeichnis

Parameter

(keine)

Rückgabewert

Traits :: to_int_type ( * gptr ( ) ) (das nächste zu lesende Zeichen im Lesebereich) im Erfolgsfall, oder Traits :: eof ( ) im Fehlerfall.

Beispiel

#include <iostream>
#include <sstream>
struct mybuf : std::stringbuf
{
    mybuf(const std::string& new_str,
          std::ios_base::openmode which = std::ios_base::in | std::ios_base::out)
        : std::stringbuf(new_str, which) {}
    int_type overflow(int_type c)
    {
        std::cout << "Before overflow():  get area size is " << egptr() - eback()
                  << ", the put area size is " << epptr() - pbase() << '\n';
        int_type rc = std::stringbuf::overflow(c);
        std::cout << "After overflow():   get area size is " << egptr() - eback()
                  << ", put area size is " << epptr() - pbase() << '\n';
        return rc;
    }
    int_type underflow()
    {
        std::cout << "Before underflow(): get area size is " << egptr() - eback()
                  << ", put area size is " << epptr() - pbase() << '\n';
        int_type ch = std::stringbuf::underflow();
        std::cout << "After underflow():  get area size is " << egptr() - eback()
                  << ", put area size is " << epptr() - pbase() << '\n';
        if (ch == EOF)
            std::cout << "underflow() returns EOF\n";
        else
            std::cout << "underflow() returns '" << char(ch) << "'\n";
        return ch;
    }
};
int main()
{
    mybuf sbuf("123"); // read-write stream
    std::iostream stream(&sbuf);
    int n;
    stream >> n; // calls sgetc() four times
                 // three calls return the characters '1', '2', '3'
                 // the fourth call, gptr() == egptr() and underflow() is called
                 // underflow returns EOF
    std::cout << "n = " << n << '\n';
    stream.clear(); // clear the eofbit
    stream << "123456"; // sputc() is called 6 times
                        // first three calls store "123" in the existing buffer
                        // 4th call finds that pptr() == epptr() and calls overflow()
                        // overflow() grows the buffer and sets egptr() to 4
                        // 5th and 6th calls store '5' and '6', advancing pptr()
    stream >> n; // calls sgetc() 4 times
                 // 1st call returns the '4' that was made available by overflow()
                 // on the 2nd call, egptr() == egptr() and underflow() is called
                 // underflow advances egptr() to equal pptr() (which is 6)
                 // 3rd sgetc() returns '6'
                 // 4th sgetc() finds gptr() == egptr(), calls underflow()
                 // underflow() returns EOF
    std::cout << "n = " << n << '\n';
}

Mögliche Ausgabe:

Before underflow(): get area size is 3, put area size is 15
After underflow():  get area size is 3, put area size is 15
underflow() returns EOF
n = 123
Before underflow(): get area size is 3, put area size is 15
After underflow():  get area size is 6, put area size is 15
underflow() returns '4'
Before underflow(): get area size is 6, put area size is 15
After underflow():  get area size is 6, put area size is 15
underflow() returns EOF
n = 456

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 432 C++98 es war unklar, ob durch overflow()
angehängte Zeichen als Teil der Eingabesequenz betrachtet werden
klargestellt

Siehe auch

[virtual]
liest Zeichen aus der zugehörigen Eingabesequenz in den Get-Bereich
(virtuelle geschützte Elementfunktion von std::basic_streambuf<CharT,Traits> )
[virtual]
liest aus der zugehörigen Datei
(virtuelle geschützte Elementfunktion von std::basic_filebuf<CharT,Traits> )
[virtual]
liest ein Zeichen aus der Eingabesequenz ohne den nächsten Zeiger zu bewegen
(virtuelle geschützte Elementfunktion von std::strstreambuf )
liest ein Zeichen aus der Eingabesequenz ohne die Sequenz zu bewegen
(öffentliche Elementfunktion von std::basic_streambuf<CharT,Traits> )