basic_streambuf verwenden...
-
Hier nochmal ein Beispiel von mir, das nicht funktioniert:
#include <iostream> #include <streambuf> using namespace std; class socket_iobuf : public streambuf { protected: streamsize xsputn(char_type* s, streamsize n) { int xJSADFKLJ; std::cout << s; return n; } public: }; class socket_stream : public ostream { protected: socket_iobuf iobuf_; public: socket_stream() : ostream(0) {} }; int main() { socket_stream foo; foo << "Hallo"; return 0; }
Ausgabe:
PS: Die Ausgabe ist das Problem!
MfG Eisflamme
-
wo bitte ist das Problem?
Ich verstehe den Code nicht, das Übernehmen funktioniert nicht.
Josuttis ist ein absoluter Profi. Der Code ist so vollkommen korrekt - warum die Funktion overflow und xsputn heisst weiss ich nicht -
...
ist das wichtig?
Schon, denn wenn ich den Scheiß einfach so überlade, wie ich denke, dass es korrekt ist, dann läuft es nicht.
Gibt sicher gute Gründe warum das Standardisierungskomitee diese Namen gewählt hat.
Die nennen das Teil overflow und benutzen write, das ist in meinen Augen alles andere als ein gut gewählter Name, aber ich lasse mich gerne belehren...
Der Code ist doch ansonsten leicht verständlich, oder?
Ehrlichgesagt überhaupt nicht, wenn ich versuche ihn für das Umzusetzen, was ich machen will, kommt nichts bei raus.
MfG Eisflamme
-
Lies doch in einer Doku nach was diese beiden Funktionen machen:
von Borland:
int_type
overflow(int_type c = traits::eof() );The member functions sputc() and sputn() call this function when not enough room can be found in the put buffer to accommodate the argument character sequence. The function returns traits::eof() if it fails to make more room available or if it fails to empty the buffer by writing the characters to their output device.
streamsize
xsputn(const char_type* s, streamsize n);Writes up to n characters to the output sequence. The characters written are obtained from successive elements of the array whose first element is designated by s. Writing stops when either n characters have been written or a call to sputc() would return traits::eof(). The function returns the number of characters written.
damit macht der name overflow wieder Sinn
ohne doku kommt man natuerlich nicht weit...
-
Gut, aber schaue dir bitte obigen Code an, der geht nach dem Prinzip, ich habe jetzt natürlich overflow nicht überladen, aber das sollte nicht so schlimm sein erstmal...
Auf alle Fälle klappt es nicht und ich weiß nicht warum.
-
Mis2com schrieb:
Auf alle Fälle klappt es nicht und ich weiß nicht warum.
1. du hast das rdbuf() im Ctor der stream Klasse vergessen
2. bei xsputn ist der 1. Parameter constfolgender Code laeuft bei mir problemlos:
#include <iostream> #include <streambuf> using namespace std; class socket_iobuf : public streambuf { protected: streamsize xsputn(char_type const* s, streamsize n) { int xJSADFKLJ; std::cout << s; return n; } public: }; class socket_stream : public ostream { protected: socket_iobuf iobuf_; public: socket_stream() : ostream(0) { rdbuf(&iobuf_); } }; int main() { socket_stream foo; foo << "Hallo"; return 0; }
-
Ich verstehe gar nicht, was das rdbuf soll...
Und das mit const char* stimmt, verdammt, dann denke ich immer, es liegt NICHT an solchen Kleinigkeiten, sondern an dicken Fehlern...
Ja, aber das kommt, wenn man es nicht versteht, und ich kann es nicht verstehen, der Code sogut wie gar nicht kommentiert und daher unbrauchbar für Leute, die sich nicht auskennen.
Danke jedenfalls,
MfG Mis2com
-
Danke
Jetzt versteh ich endlich wie ich meine Klasse über iostream implementieren kann
-
Ich habe einfach keinerlei Hintergrundwissen zur STL, ich weiß jetzt so etwa, welche Klasse von welcher erbt, aber ich kapier char_traits und das ganze Template-Zeugs nicht, die ganzen Funktionen etc.pp.
Wie kann ich das erlernen? Eine Dokumentation alleine offenbart die ganzen Zusammenhänge nicht gut.
-
Mis2com schrieb:
Ich verstehe gar nicht, was das rdbuf soll...
Das setzt einfach den buffer.
Woher soll ostream denn sonst wissen, welchen buffer es verwenden soll?
-
und was heißt hier bitte verwenden?
Was man mit dem, was durch << rein und >> raus geht, macht, entscheidet man doch selber, wozu braucht der dann einen buffer?
-
Mis2com schrieb:
und was heißt hier bitte verwenden?
Was man mit dem, was durch << rein und >> raus geht, macht, entscheidet man doch selber, wozu braucht der dann einen buffer?Der buffer erledigt die ganze Arbeit! Er puffert und er schreibt.
der stream macht nur die formatierungen - er achtet auf setw, fill, etc. und er wandelt alles in strings um. Dann gibt er den fertigen string an den buffer weiter - dort wird dann eben gepuffert (oder auch nicht, bei deinem code wird nicht gepuffert) und schreibt die daten dann nach cout.
woher soll ostream denn wissen, welchen buffer es verwenden soll, wenn man ihm mit rdbuf() nicht sagt welchen puffer er verwenden soll?
das ganze konzept basiert darauf, dass ein stream 'dumm' ist. ostream macht die arbeit alleine - eine abgeleitete stream klasse ist nur dafuer da, den streambuffer automatisch zu setzen.
man kann auch
ostream s(0);
s.rdbuf(&mein_puffer);schreiben - aber da das unpraktisch ist, leitet man eine klasse von ostream ab, die das uebernimmt.
-
Shade Of Mine schrieb:
[...]weiter - dort wird dann eben gepuffert (oder auch nicht, bei deinem code wird nicht gepuffert) und schreibt die daten dann nach cout.
[...]Jetzt verwirrst du mich, ich kann die Daten doch nicht nur nach cout schreiben
sondern dorthin wo ich will, oder?
-
SirLant schrieb:
Jetzt verwirrst du mich, ich kann die Daten doch nicht nur nach cout schreiben
sondern dorthin wo ich will, oder?logisch. ich habe das jetzt nur mal auf den beispielcode bezogen.
der streambuf ist fuer das verwalten (puffern, schreiben, uU komprimieren oder verschluesseln,...) zustaendig.
-
Mis2com schrieb:
Ich habe einfach keinerlei Hintergrundwissen zur STL
Das hat nichts mit der Standard Template Library zu tun - das sind nämlich nur die Container und Algorithmen, die man am einfachsten an den vernünftig gewählten Namen von den IOStreams unterscheiden kann
-
Wieso gehört der streambuf nicht zur STL?
Wozu denn dann? Es ist ja nichts, was einfach so optional dazu gebaut wird, weil es keine STL Implementierung gibt, die ohne basic_streambuf arbeitet, oder etwa doch?Mir ist das jetzt jedenfalls klar, danke.
MfG Eisflamme
-
operator void ist nur pedantisch.
Im Prinzip meinen wir die C++ Standard Library wenn wir STL sagen. Denn STL war der Prototyp der Container der C++ Standard Library.STL ist also eigentlich falsch - aber es ist so schön kurz
deshalb verwenden es alle.
-
aber basic_streambuf ist doch auch ein Template!?
-
Hat wer von euch das Buch von Josuttis? Geht das auch auf die Implementierung ein,
oder nur die Benutzung?
Gibt es überhaupt nen Buch, dass nicht nur auf die Benutzung eingeht sondern auch,
wie die Internas und wie man die Klassen erweitert so wie in dem Beispiel von
Josuttis?
Oder gibt es so etwas online? Sollte natürlich verständlich seinUnd meine Ausgabe über die Ableitung der Streams funktioniert, jetzt muss ich das
nur noch in meine Konsole zeichnen
-
http://www.langer.camelot.de/IOStreams/Excerpt/excerpt.htm
Hinweis auf Buch und Text.