Namespaces
Variants

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

From cppreference.net
protected :
virtual int_type overflow ( int_type c = Traits :: eof ( ) ) ;

Ajoute le caractère c à la séquence de caractères de sortie.

Si c est l'indicateur de fin de fichier ( traits :: eq_int_type ( c, traits :: eof ( ) ) == true ), alors il n'y a aucun caractère à ajouter. La fonction ne fait rien et retourne une valeur non spécifiée autre que traits :: eof ( ) .

Sinon, si la séquence de sortie a une position d'écriture disponible ou si cette fonction peut réussir à rendre une position d'écriture disponible, alors elle appelle sputc ( c ) et retourne c .

Cette fonction peut rendre une position d'écriture disponible si le std::stringbuf est ouvert en écriture ( ( mode & ios_base :: out ) ! = 0 ) : dans ce cas, elle réalloue (ou alloue initialement) le tampon suffisamment grand pour contenir l'intégralité du tampon actuel plus au moins un caractère supplémentaire. Si le std::stringbuf est également ouvert en lecture ( ( mode & ios_base :: in ) ! = 0 ), alors overflow augmente également la taille de la zone de lecture en déplaçant egptr() pour pointer juste après la nouvelle position d'écriture.

Table des matières

Paramètres

c - le caractère à stocker dans la zone de mise

Valeur de retour

Traits :: eof ( ) pour indiquer un échec, c si le caractère c a été ajouté avec succès, ou une valeur autre que Traits :: eof ( ) si appelé avec Traits :: eof ( ) comme argument.

Notes

Cette fonction diffère d'un overflow() typique qui déplace le contenu du tampon vers la séquence de caractères associée, car pour un std::basic_stringbuf , le tampon et la séquence associée sont une seule et même entité.


Exemple

Dans l'implémentation utilisée pour exécuter cet exemple (par exemple GCC-4.9), overflow() sur-alloue la zone de sortie à 512 octets : un appel à str() ne retournerait que les quatre octets initialisés, mais les 508 appels suivants à sputc() ne nécessiteraient pas de nouveaux appels à overflow() .

#include <sstream>
#include <iostream>
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 = EOF) override
    {
        std::cout << "stringbuf::overflow('" << char(c) << "') called\n"
                  << "Before: size of get area: " << egptr() - eback() << '\n'
                  << "        size of put area: " << epptr() - pbase() << '\n';
        int_type ret = std::stringbuf::overflow(c);
        std::cout << "After : size of get area: " << egptr() - eback() << '\n'
                  << "        size of put area: " << epptr() - pbase() << '\n';
        return ret;
    }
};
int main()
{
    std::cout << "read-write stream:\n";
    mybuf sbuf("   "); // read-write stream
    std::iostream stream(&sbuf);
    stream << 1234;
    std::cout << sbuf.str() << '\n';
    std::cout << "\nread-only stream:\n";
    mybuf ro_buf("   ", std::ios_base::in); // read-only stream
    std::iostream ro_stream(&ro_buf);
    ro_stream << 1234;
    std::cout << "\nwrite-only stream:\n";
    mybuf wr_buf("   ", std::ios_base::out); // write-only stream
    std::iostream wr_stream(&wr_buf);
    wr_stream << 1234;
}

Sortie possible :

read-write stream:
stringbuf::overflow('4') called
Before: size of get area: 3
        size of put area: 3
After : size of get area: 4
        size of put area: 512
1234
read-only stream:
stringbuf::overflow('1') called
Before: size of get area: 3
        size of put area: 0
After : size of get area: 3
        size of put area: 0
write-only stream:
stringbuf::overflow('4') called
Before: size of get area: 0
        size of put area: 3
After : size of get area: 0
        size of put area: 512

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 Appliqué à Comportement publié Comportement corrigé
LWG 169 C++98 le tampon (ré)alloué ne pouvait contenir qu'un seul caractère supplémentaire permet plus de caractères supplémentaires
LWG 432 C++98 overflow déplaçait epptr() pour pointer juste après la nouvelle
position d'écriture si le std::stringbuf est ouvert en lecture
il n'est pas déplacé

Voir aussi

[virtual]
écrit des caractères dans la séquence de sortie associée depuis la zone de mise en mémoire tampon
(fonction membre protégée virtuelle de std::basic_streambuf<CharT,Traits> )
[virtual]
renvoie le prochain caractère disponible dans la séquence d'entrée
(fonction membre protégée virtuelle)