Namespaces
Variants

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

From de.cppreference.net
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)