Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | io‎ | basic stringbuf
 
 
 
 
protected:
virtual int_type overflow( int_type c = Traits::eof() );

Hängt das Zeichen c an die Ausgabezeichensequenz an.

Wenn c der End-of-File-Indikator ist (traits::eq_int_type(c, traits::eof()) = true), dann gibt es kein Zeichen anzuhängen. Die Funktion tut nichts und gibt einen nicht spezifizierten Wert zurück, der sich von traits::eof() unterscheidet.

Andernfalls, wenn die Ausgabesequenz eine verfügbare Schreibposition hat oder diese Funktion erfolgreich eine Schreibposition verfügbar machen kann, ruft sie sputc(c) auf und gibt c zurück.

Diese Funktion kann eine Schreibposition verfügbar machen, wenn der std::stringbuf für die Ausgabe geöffnet ist ((mode & ios_base::out) != 0): In diesem Fall wird der Puffer neu zugewiesen (oder initial zugewiesen), um groß genug zu sein, um den gesamten aktuellen Puffer plus mindestens ein weiteres Zeichen aufzunehmen. Wenn der std::stringbuf auch für die Eingabe geöffnet ist ((mode & ios_base::in) != 0), erhöht overflow auch die Größe des Get-Bereichs, indem egptr() so verschoben wird, dass er direkt hinter die neue Schreibposition zeigt.

Inhalt

[edit] Parameter

c - das zu speichernde Zeichen im Put-Bereich

[edit] Rückgabewert

Traits::eof(), um einen Fehler anzuzeigen, c, wenn das Zeichen c erfolgreich angehängt wurde, oder einen Wert, der sich von Traits::eof() unterscheidet, wenn er mit Traits::eof() als Argument aufgerufen wurde.

[edit] Hinweise

Diese Funktion unterscheidet sich von einem typischen overflow(), das den Inhalt des Puffers in die zugehörige Zeichensequenz verschiebt, da bei einem std::basic_stringbuf der Puffer und die zugehörige Sequenz eins und dasselbe sind.


[edit] Beispiel

In der Implementierung, die zur Ausführung dieses Beispiels verwendet wird (z. B. GCC-4.9), überweist overflow() den Put-Bereich 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

[edit] Fehlerberichte

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 169 C++98 der Puffer (neu) zugewiesen konnte nur ein zusätzliches Zeichen aufnehmen lässt mehr zusätzliche Zeichen zu
LWG 432 C++98 overflow verschob epptr(), um direkt hinter das Neue zu zeigen
Schreibposition, wenn der std::stringbuf für die Eingabe geöffnet ist
er wird nicht verschoben

[edit] Siehe auch

[virtuell]
schreibt Zeichen aus dem Put-Bereich in die zugeordnete Ausgabesequenz
(virtuelle geschützte Member-Funktion von std::basic_streambuf<CharT,Traits>) [bearbeiten]
[virtuell]
gibt das nächste in der Eingabesequenz verfügbare Zeichen zurück
(virtuelle geschützte Memberfunktion) [edit]