Namespaces
Variants

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

From cppreference.net
protected :
virtual int_type underflow ( )

Lit le caractère suivant de la zone de lecture du tampon.

Spécifiquement :

1) Si la séquence d'entrée a une position de lecture disponible ( egptr ( ) > gptr ( ) ), retourne Traits :: to_int_type ( * gptr ( ) )
2) Sinon, si pptr ( ) > egptr ( ) (certains caractères ont été insérés dans le flux depuis la dernière fois que overflow() a modifié egptr() ), alors étend la fin de la zone de lecture pour inclure les caractères les plus récemment insérés, en modifiant egptr() pour qu'il soit égal à pptr() , puis retourne Traits :: to_int_type ( * gptr ( ) )
3) Sinon, retourne Traits :: eof ( ) .

Tout caractère dans le tampon qui a été initialisé, qu'il provienne de la chaîne passée dans le constructeur ou qu'il ait été ajouté par overflow() , est considéré comme faisant partie de la séquence d'entrée.

Table des matières

Paramètres

(aucun)

Valeur de retour

Traits :: to_int_type ( * gptr ( ) ) (le prochain caractère à lire dans la zone de lecture) en cas de succès, ou Traits :: eof ( ) en cas d'échec.

Exemple

#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"); // flux en lecture-écriture
    std::iostream stream(&sbuf);
    int n;
    stream >> n; // appelle sgetc() quatre fois
                 // trois appels retournent les caractères '1', '2', '3'
                 // le quatrième appel, gptr() == egptr() et underflow() est appelé
                 // underflow retourne EOF
    std::cout << "n = " << n << '\n';
    stream.clear(); // efface l'eofbit
    stream << "123456"; // sputc() est appelé 6 fois
                        // les trois premiers appels stockent "123" dans le tampon existant
                        // le 4ème appel trouve que pptr() == epptr() et appelle overflow()
                        // overflow() agrandit le tampon et définit egptr() à 4
                        // les 5ème et 6ème appels stockent '5' et '6', avançant pptr()
    stream >> n; // appelle sgetc() 4 fois
                 // le 1er appel retourne le '4' rendu disponible par overflow()
                 // au 2ème appel, egptr() == egptr() et underflow() est appelé
                 // underflow avance egptr() pour égaler pptr() (qui est 6)
                 // le 3ème sgetc() retourne '6'
                 // le 4ème sgetc() trouve gptr() == egptr(), appelle underflow()
                 // underflow() retourne EOF
    std::cout << "n = " << n << '\n';
}

Sortie possible :

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

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 Applicable à Comportement publié Comportement corrigé
LWG 432 C++98 il n'était pas clair si les caractères ajoutés par overflow()
sont considérés comme faisant partie de la séquence d'entrée
clarifié

Voir aussi

[virtual]
lit les caractères de la séquence d'entrée associée vers la zone de récupération
(fonction membre protégée virtuelle de std::basic_streambuf<CharT,Traits> )
[virtual]
lit depuis le fichier associé
(fonction membre protégée virtuelle de std::basic_filebuf<CharT,Traits> )
[virtual]
lit un caractère de la séquence d'entrée sans avancer le pointeur suivant
(fonction membre protégée virtuelle de std::strstreambuf )
lit un caractère de la séquence d'entrée sans avancer la séquence
(fonction membre publique de std::basic_streambuf<CharT,Traits> )