Namespaces
Variants

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

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

Garantit qu'au moins un caractère est disponible dans la zone d'entrée en mettant à jour les pointeurs vers la zone d'entrée (si nécessaire) et en lisant plus de données depuis la séquence d'entrée (le cas échéant). Retourne la valeur de ce caractère (convertie en int_type avec Traits :: to_int_type ( c ) ) en cas de succès ou Traits :: eof ( ) en cas d'échec.

La fonction peut mettre à jour gptr , egptr et eback pour définir l'emplacement des nouvelles données chargées (le cas échéant). En cas d'échec, la fonction garantit que soit gptr ( ) == nullptr soit gptr ( ) == egptr .

La version de la fonction de la classe de base ne fait rien. Les classes dérivées peuvent redéfinir cette fonction pour permettre des mises à jour de la zone d'acquisition en cas d'épuisement.

Table des matières

Paramètres

(aucun)

Valeur de retour

La valeur du caractère pointé par le pointeur de lecture après l'appel en cas de succès, ou Traits :: eof ( ) sinon.

La version de la fonction de la classe de base retourne traits :: eof ( ) .

Remarque

Les fonctions publiques de std::streambuf appellent cette fonction uniquement si gptr ( ) == nullptr ou gptr ( ) >= egptr ( ) .

Exemple

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

Sortie :

This is an example

Voir aussi

[virtual]
lit les caractères de la séquence d'entrée associée vers la zone de lecture et avance le pointeur suivant
(fonction membre protégée virtuelle)
[virtual]
écrit les caractères vers la séquence de sortie associée depuis la zone d'écriture
(fonction membre protégée virtuelle)
[virtual]
lit depuis le fichier associé
(fonction membre protégée virtuelle de std::basic_filebuf<CharT,Traits> )
[virtual]
retourne le prochain caractère disponible dans la séquence d'entrée
(fonction membre protégée virtuelle de std::basic_stringbuf<CharT,Traits,Allocator> )
[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 )