std::basic_stringbuf<CharT,Traits,Allocator>:: overflow
|
protected
:
virtual int_type overflow ( int_type c = Traits :: eof ( ) ) ; |
||
Hängt das Zeichen c an die Ausgabesequenz von Zeichen an.
Wenn c das Dateiende-Kennzeichen ist ( traits :: eq_int_type ( c, traits :: eof ( ) ) == true ), dann gibt es kein anzuhängendes Zeichen. Die Funktion tut nichts und gibt einen nicht spezifizierten Wert zurück, der nicht traits :: eof ( ) ist.
Andernfalls, wenn die Ausgabesequenz eine Schreibposition verfügbar hat oder diese Funktion erfolgreich eine Schreibposition verfügbar machen kann, dann ruft sputc ( c ) und gibt c zurück.
Diese Funktion kann eine Schreibposition verfügbar machen, falls der
std::stringbuf
für Ausgabe geöffnet ist (
(
mode
&
ios_base
::
out
)
!
=
0
): in diesem Fall alloziert er den Puffer (oder initial alloziert) groß genug, um den gesamten aktuellen Puffer plus mindestens ein weiteres Zeichen zu halten. Falls der
std::stringbuf
auch für Eingabe geöffnet ist (
(
mode
&
ios_base
::
in
)
!
=
0
), dann erhöht
overflow
auch die Größe des Lesebereichs, indem
egptr()
so verschoben wird, dass es direkt hinter die neue Schreibposition zeigt.
Inhaltsverzeichnis |
Parameter
| c | - | das Zeichen, das im Put-Bereich gespeichert werden soll |
Rückgabewert
Traits :: eof ( ) um einen Fehler anzuzeigen, c falls das Zeichen c erfolgreich angehängt wurde, oder einen anderen Wert als Traits :: eof ( ) zurückgibt, wenn es mit Traits :: eof ( ) als Argument aufgerufen wird.
Hinweise
Diese Funktion unterscheidet sich von einer typischen
overflow()
, die den Inhalt des Puffers zur assoziierten Zeichensequenz verschiebt, da für einen
std::basic_stringbuf
der Puffer und die assoziierte Sequenz ein und dasselbe sind.
Beispiel
In der Implementierung, die zur Ausführung dieses Beispiels verwendet wird (z.B. GCC-4.9),
overflow()
alloziert den Put-Bereich übermäßig auf 512 Bytes: Ein Aufruf von
str()
würde nur die vier initialisierten Bytes zurückgeben, aber die nächsten 508 Aufrufe von
sputc()
würden keine neuen Aufrufe von
overflow()
erfordern.
#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; }
Mögliche Ausgabe:
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
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 169 | C++98 | der (re)alloziierte Puffer konnte nur ein zusätzliches Zeichen aufnehmen | erlaubt mehr zusätzliche Zeichen |
| LWG 432 | C++98 |
overflow
bewegte
epptr()
um direkt hinter die neue
Schreibposition zu zeigen, wenn der
std::stringbuf
für Eingabe geöffnet ist
|
wird nicht bewegt |
Siehe auch
|
[virtual]
|
Schreibt Zeichen in die zugehörige Ausgabesequenz aus dem Put-Bereich
(virtuelle geschützte Memberfunktion von
std::basic_streambuf<CharT,Traits>
)
|
|
[virtual]
|
gibt das nächste verfügbare Zeichen in der Eingabesequenz zurück
(virtuelle geschützte Memberfunktion) |