std::basic_streambuf<CharT,Traits>::overflow
| protected: virtual int_type overflow( int_type ch = Traits::eof() ); |
||
Die Absicht dieser Funktion ist es, Zeichen aus dem [[cpp/io/basic_streambuf|Put-Bereich] des Stream-Puffers in die zugeordnete Zeichensequenz zu übertragen.
Formal ausgedrückt stellt diese Funktion sicher, dass im Put-Bereich Platz für mindestens ein Zeichen vorhanden ist. Die Basisklassenversion schlägt immer fehl, und eine möglicherweise erfolgreiche Implementierung kann nur in abgeleiteten Klassen bereitgestellt werden (siehe Implementierungsanforderungen). Die Standardbibliothek stellt std::strstreambuf::overflow(), (bis C++26)std::basic_stringbuf::overflow() und std::basic_filebuf::overflow() zur Verfügung.
Inhalt |
[bearbeiten] Parameter
| ch | - | das zu speichernde Zeichen im Put-Bereich |
[bearbeiten] Rückgabewert
Traits::eof()
[bearbeiten] Implementierungsanforderungen
Jede überschreibende Definition dieser virtuellen Funktion muss die folgenden Einschränkungen befolgen, andernfalls ist das Verhalten undefiniert.
- Die Auswirkung der Funktion besteht darin, eine Anfangsuntersequenz der Zeichen der *ausstehenden Sequenz* zu verbrauchen. Die ausstehende Sequenz ist definiert als die Verkettung der folgenden Sequenzen:
- Nach dem Verbrauch werden die Put-Bereich-Zeiger aktualisiert, um die verbleibenden Zeichen, falls vorhanden, zu halten. Formal, sei r die Anzahl der Zeichen in der ausstehenden Sequenz, die nicht verbraucht wurden.
- Wenn r nicht null ist, dann werden pbase() und pptr() so gesetzt, dass alle folgenden Bedingungen erfüllt sind:
- pptr() - pbase() ist r.
- Die r Zeichen beginnend bei pbase() sind der zugeordnete Ausgabestrom.
- Wenn r null ist (alle Zeichen der ausstehenden Sequenz wurden verbraucht), dann wird entweder pbase() auf einen Nullwert gesetzt oder pbase() und pptr() werden beide auf denselben Nicht-Null-Wert gesetzt.
- Wenn r nicht null ist, dann werden pbase() und pptr() so gesetzt, dass alle folgenden Bedingungen erfüllt sind:
- Die Funktion kann fehlschlagen, wenn entweder das Anhängen eines Zeichens an den zugeordneten Ausgabestrom fehlschlägt oder wenn sie pbase() und pptr() gemäß den obigen Regeln nicht einrichten kann.
- Wenn die Funktion erfolgreich ist, gibt sie einen Wert zurück, der sich von Traits::eof() unterscheidet. Typischerweise wird ch zurückgegeben, um Erfolg anzuzeigen, außer wenn Traits::eq_int_type(ch, Traits::eof()) true zurückgibt. In diesem Fall wird Traits::not_eof(ch) zurückgegeben.
- Wenn die Funktion fehlschlägt, gibt sie Traits::eof() zurück oder löst eine Ausnahme aus.
[bearbeiten] Hinweis
Die Funktionen sputc() und sputn() rufen diese Funktion bei einem Überlauf auf (pptr() == nullptr oder pptr() >= epptr()).
[bearbeiten] Beispiel
#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"; }
Ausgabe
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
[bearbeiten] Siehe auch
| [virtuell] |
liest Zeichen aus der zugeordneten Eingabesequenz in den Get-Bereich und rückt den nächsten Zeiger vor (virtuelle geschützte Memberfunktion) |
| [virtuell] |
liest Zeichen aus der zugeordneten Eingabesequenz in den Get-Bereich (virtuelle geschützte Memberfunktion) |
| [virtuell] |
schreibt Zeichen aus dem Schreibbereich in die zugeordnete Datei (virtuelle geschützte Memberfunktion von std::basic_filebuf<CharT,Traits>) |
| [virtuell] |
hängt ein Zeichen an die Ausgabesequenz an (virtuelle geschützte Memberfunktion von std::basic_stringbuf<CharT,Traits,Allocator>) |
| [virtuell] |
hängt ein Zeichen an die Ausgabesequenz an, kann den Puffer neu allokieren oder initial allokieren, falls er dynamisch und nicht eingefroren ist (virtuelle geschützte Memberfunktion von std::strstreambuf) |