 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
thomas weidner Guest
|
Posted: Tue May 18, 2004 10:10 pm Post subject: eigener streambuffer? |
|
|
Hi,
Ich bin dabei mir einen eigenen streambuffer zu schreiben, war soweit
fertig und mein puffer scheint auch groesstenteils zu funktionieren.
Jedoch habe ich dann mal ein Blick auf die G++ implementierung von
basic_filebuf geworfen. was ich gewundert hat,war das dort nirgends
eback() oder pbase() gesetzt werden. Wenn setbuf() aufgerufen wird,teile
ich den speicher in get,put und ggf. convertierungs (fuer
codecvt<>::in und out) area (ja schoenes denglish). Mache ich das richtig
so mit setg und setp puffer zu setzen, oder habe ich was falsch
verstanden? sollte das std::basic_streambuf schon machen oder der stream
der den streambuffer nutzt? (der sollte ja setbuf aufrufen,oder?) Ich bin
schwer verunsichert,da im Struppi auch recht wenig dazu steht. Bin fuer
hilfe oder links dankbar.
Thomas
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Werner Salomon Guest
|
Posted: Sat May 22, 2004 4:31 pm Post subject: Re: eigener streambuffer? |
|
|
thomas weidner <3.14159 (AT) gmx (DOT) net> wrote
| Quote: | Ich bin dabei mir einen eigenen streambuffer zu schreiben, war soweit
fertig und mein puffer scheint auch groesstenteils zu funktionieren.
Jedoch habe ich dann mal ein Blick auf die G++ implementierung von
basic_filebuf geworfen. was ich gewundert hat,war das dort nirgends
eback() oder pbase() gesetzt werden. Wenn setbuf() aufgerufen wird,teile
ich den speicher in get,put und ggf. convertierungs (fuer
codecvt<>::in und out) area (ja schoenes denglish). Mache ich das richtig
so mit setg und setp puffer zu setzen, oder habe ich was falsch
verstanden? sollte das std::basic_streambuf schon machen oder der stream
der den streambuffer nutzt? (der sollte ja setbuf aufrufen,oder?) Ich bin
schwer verunsichert,da im Struppi auch recht wenig dazu steht. Bin fuer
hilfe oder links dankbar.
|
Hallo Thomas,
man unterscheidet bei der Implementierung von Derivaten von
basic_streambuf zwischen gepuffertem und ungepuffertem Input/Output.
Verwendest Du einen Buffer für Schreiben und Lesen, so hast Du eine
gepufferte Implementierung. Dann ist es nicht nur korrekt, sondern
auch zwingend notwendig mit setp bzw. setg die Lese- und Schreibzeiger
(eback(). pbase(), usw.) zu setzen.
Bei den mir bekannten Implementierungen von basic_filebuf wird jeweils
die ungepufferte Implementierung verwendet. Der Grund liegt meines
Wissens darin, dass die Pufferung tiefer im Betriebssystem sowieso
erfolgt und auf dem Level des Streambufs gar nicht notwendig ist. Also
wird hier auch kein setp,setg aufgerufen, weil hier der konkrete
streambuf auch keinen eigenen Buffer besitzt.
File-IO ist bei den üblichen Betriebssytemen etwas so rudimentäres,
dass hinter einer File-Schnittstelle (in Windows z.B. fputwc; schreibt
ein (!) Zeichen) ohnehin vom Betriebssystem her für eine performante
Bearbeitung gesorgt wird.
Eine Pufferung benötigt man genau dann, wenn man an der zur Verfügung
stehenden Schnittstelle zum Device hin auch mehr als ein Zeichen
schreiben bzw. lesen kann; und das dann auch performanter ist, als
einzelne Zeichen zu bearbeiten. Sockets sind ein gutes Beispiel
hierfür.
Zu 'setbuf':
Das sogenannte Buffermanagement innerhalb eines Streambufs wird aber
nicht über setbuf realisiert. Das Verhalten von setbuf ist im Prinzip
dem Programmierer des konkreten Streambufs überlassen! Von den
Standard-Streams wird setbuf nicht aufgerufen.
(siehe auch: <http://www.roguewave.com/support/docs/sourcepro/stdlibref/basic-streambuf.html>)
'setp' wird bei gepufferten Implementierungen i.A. in den Methoden
overflow, sync und/oder dem Konstruktor aufgerufen.
Gruß
Werner
Literatur:
Standard C++ IOStreams and Locales
von Angelika Langer, Klaus Kreft
Sprache: Englisch
Gebundene Ausgabe - 672 Seiten - Addison-Wesley Professional
Erscheinungsdatum: 1. Februar 2000
ISBN: 0201183951
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|