std::basic_stringbuf<CharT,Traits,Allocator>:: overflow
|
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) |