std::basic_streambuf<CharT,Traits>:: overflow
|
protected
:
virtual int_type overflow ( int_type ch = Traits :: eof ( ) ) ; |
||
L'intention de cette fonction est de transmettre les caractères de la zone de mise du tampon de flux vers la séquence de caractères associée .
Formellement, cette fonction garantit qu'il y a de l'espace dans la zone de sortie pour au moins un caractère. La version de la classe de base échoue toujours, et une implémentation pouvant réussir ne peut être fournie que dans les classes dérivées (voir exigences d'implémentation ). La bibliothèque standard fournit std::strstreambuf::overflow() , (jusqu'à C++26) std::basic_stringbuf::overflow() et std::basic_filebuf::overflow() .
Table des matières |
Paramètres
| ch | - | le caractère à stocker dans la zone de put |
Valeur de retour
Traits :: eof ( )
Exigences de mise en œuvre
Toute définition de redéfinition de cette fonction virtuelle doit respecter les contraintes suivantes, sinon le comportement est indéfini :
- L'effet de la fonction est de consommer une sous-séquence initiale des caractères de la séquence en attente . La séquence en attente est définie comme la concaténation des séquences suivantes :
-
Après consommation, les pointeurs de la zone de sortie sont mis à jour pour contenir les caractères restants, s'il y en a. Formellement, soit
r
le nombre de caractères dans la séquence en attente non consommés :
-
Si
r
est non nul, alors
pbase()
et
pptr()
sont définis de sorte que toutes les conditions suivantes soient satisfaites :
- pptr ( ) - pbase ( ) est r .
- Les r caractères commençant à pbase() sont le flux de sortie associé.
- Si r est zéro (tous les caractères de la séquence en attente ont été consommés), alors soit pbase() est défini à une valeur nulle, soit pbase() et pptr() sont tous deux définis à la même valeur non nulle.
-
Si
r
est non nul, alors
pbase()
et
pptr()
sont définis de sorte que toutes les conditions suivantes soient satisfaites :
- La fonction peut échouer si soit l'ajout d'un caractère au flux de sortie associé échoue, soit si elle est incapable d'établir pbase() et pptr() selon les règles ci-dessus.
- Si la fonction réussit, retourne une valeur autre que Traits :: eof ( ) . Typiquement, ch est retourné pour indiquer le succès, sauf lorsque Traits :: eq_int_type ( ch, Traits :: eof ( ) ) retourne true , auquel cas Traits :: not_eof ( ch ) est retourné.
- Si la fonction échoue, retourne Traits :: eof ( ) ou lance une exception.
Remarque
Les fonctions sputc() et sputn() appellent cette fonction en cas de dépassement de capacité ( pptr ( ) == nullptr ou pptr ( ) >= epptr ( ) ).
Exemple
#include <array> #include <cstddef> #include <iostream> // Buffer for std::ostream implemented by std::array template<std::size_t size, class CharT = char> struct ArrayedStreamBuffer : std::basic_streambuf<CharT> { using Base = std::basic_streambuf<CharT>; using char_type = typename Base::char_type; using int_type = typename Base::int_type; ArrayedStreamBuffer() { // put area pointers to work with 'buffer' Base::setp(buffer.data(), buffer.data() + size); } int_type overflow(int_type ch) { std::cout << "overflow\n"; return Base::overflow(ch); } void print_buffer() { for (char_type i : buffer) { if (i == 0) std::cout << "\\0"; else std::cout << i; std::cout << ' '; } std::cout << '\n'; } private: std::array<char_type, size> buffer{}; // value-initialize buffer }; int main() { ArrayedStreamBuffer<10> streambuf; std::ostream stream(&streambuf); stream << "hello"; streambuf.print_buffer(); if (stream.good()) std::cout << "stream is good\n"; stream << "world"; streambuf.print_buffer(); if (stream.good()) std::cout << "stream is good\n"; stream << "!"; streambuf.print_buffer(); if (!stream.good()) std::cout << "stream is not good\n"; }
Sortie :
h e l l o \0 \0 \0 \0 \0 stream is good h e l l o w o r l d stream is good overflow h e l l o w o r l d stream is not good
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]
|
lit les caractères de la séquence d'entrée associée vers la zone de lecture
(fonction membre protégée virtuelle) |
|
[virtual]
|
écrit les caractères vers le fichier associé depuis la zone d'écriture
(fonction membre protégée virtuelle de
std::basic_filebuf<CharT,Traits>
)
|
|
[virtual]
|
ajoute un caractère à la séquence de sortie
(fonction membre protégée virtuelle de
std::basic_stringbuf<CharT,Traits,Allocator>
)
|
|
[virtual]
|
ajoute un caractère à la séquence de sortie, peut réallouer ou allouer initialement le tampon si dynamique et non gelé
(fonction membre protégée virtuelle de
std::strstreambuf
)
|