 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Florian Weimer Guest
|
Posted: Mon Jun 28, 2004 8:18 pm Post subject: I/O fuer eigene Objekte implementieren |
|
|
Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator>>
fuer benutzerdefinierte Typen?
Der Code sollte eine _vollständige_ Fehlerbehandlung aufweisen und in
demselben Verhalten resultieren wie die von der I/O-Bibliothek
mitgelieferten Operatoren.
Die libstdc++-v3-Quellen sind wegen der locale-Unterstützung leider
ziemlich schwer verständlich.
Als nächsten Schritt würde ich dann gerne selbst streambufs (oder wie
die heute heißen) implementieren, z.B. für bestimmte Formen von
Socket-I/O oder BLOBs in Datenbanken.
Ansonsten werde ich wohl dazu übergehen müssen, wieder C-Streams zu
verwenden und für den Rest eben jedes mal eine leicht andere
I/O-Implementierung (meinetwegen mit ein paar Wrapper-Klassen, um die
Code-Vermehrung in Grenzen zu halten). 8-(
--
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 |
|
 |
Martin Kaul Guest
|
Posted: Tue Jun 29, 2004 6:09 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
Florian Weimer wrote:
| Quote: | Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator
fuer benutzerdefinierte Typen?
Der Code sollte eine _vollständige_ Fehlerbehandlung aufweisen und in
demselben Verhalten resultieren wie die von der I/O-Bibliothek
mitgelieferten Operatoren.
Die libstdc++-v3-Quellen sind wegen der locale-Unterstützung leider
ziemlich schwer verständlich.
Als nächsten Schritt würde ich dann gerne selbst streambufs (oder wie
die heute heißen) implementieren, z.B. für bestimmte Formen von
Socket-I/O oder BLOBs in Datenbanken.
|
Such mal mit google nach "socketstream c++". Der zweite Eintrag
verweist auf ein Projekt bei sourceforge.net... Den Sourcecode
hab ich mal als Referenz für ne eigene Streamklasse verwendet...
Auch in der Boost Bibliothek gibt es glaub ich ein Socket-Stream.
tschaule
Martin
--
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 |
|
 |
Philipp Bachmann Guest
|
Posted: Tue Jun 29, 2004 9:56 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
| Quote: | Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator
fuer benutzerdefinierte Typen?
Der Code sollte eine _vollständige_ Fehlerbehandlung aufweisen und in
demselben Verhalten resultieren wie die von der I/O-Bibliothek
mitgelieferten Operatoren.
|
Stroustrup: TC++PL enthaelt m.E. alles, was Du brauchst - ein Anhang
der aktuellen Auflage behandelt zusaetzlich Lokalisierung.
Zur "Fehlerbehandlung": M.E. ist dies hier ein irrefuehrendes Wort. Bei der
Eingabe geht es vielmehr darum, auf nichterwartete / fehlerhafte Zeichen(-ketten)
zu reagieren, indem man den Fehler weiterreicht an den Aufrufer - "behandeln"
kann man ihn bei der Eingabe selbst nur in wenigen Faellen (das soll aber nicht
heissen, dass Du Deine Eingabefunktion nicht moeglichst robust bauen solltest).
Weitere Fehlermoeglichkeiten ergeben sich durch den hierarchischen Aufbau
Deiner Datenstrukturen und damit auch Deiner (De-) Serialisierungsroutinen:
Fuer Member Deiner Strukturen greifst Du auf schon existierende "operator<<()"
resp. "operator>>()" zu - auch diese koennen den Streamzustand veraendern.
Auch dieser Aspekt wird in Stroustrup kurz an einem Beispiel (Kap. 21.3.5
in meiner deutschen 3. Auflage von 1998) erlaeutert - es ist einfach
"stream.clear(ios_base::badbit);" Der Aufrufer kann sich dann selbst ueberlegen,
ob er den Zustand fortlaufend abfragen moechte oder sich Fehler als Ausnahme
signalisieren lassen moechte.
Cheers,
Philipp.
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Tue Jun 29, 2004 10:20 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
"Florian Weimer" <fw (AT) deneb (DOT) enyo.de> schrieb:
| Quote: | Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator
fuer benutzerdefinierte Typen?
|
Das geht etwa entlang folgender Zeilen:
template< typename Char, typename Traits >
std::basic_istream< Char, Traits > operator >> (
std::basic_istream< Char, Traits > & is,
My my
){
bool ok = false;
try {
std::basic_istream< Char, Traits >::sentry se( is );
if( is ) {
// input code here
ok = true;
}
} catch( ... ) {
bool rethrow = false;
try { is.setstate( std::ios_base::badbit ); }
catch( ... ) { rethrow = true; }
if( rethrow ) throw;
}
if( !ok ) is.setstate( std::ios_base::failbit );
return is;
}
| Quote: | Der Code sollte eine _vollständige_ Fehlerbehandlung aufweisen und in
demselben Verhalten resultieren wie die von der I/O-Bibliothek
mitgelieferten Operatoren.
|
Zwischem dem, was der Standard verlangt, und dem, was übliche Libs
machen, gibt es wohl marginale Unterschiede. Es lohnt sich, einfach
mal bei den Library-Issues den I/O-Teil durchzuschauen.
| Quote: | Als nächsten Schritt würde ich dann gerne selbst streambufs (oder wie
die heute heißen) implementieren, z.B. für bestimmte Formen von
Socket-I/O oder BLOBs in Datenbanken.
|
Das ist der eher einfache Teil. Die Forderungen an (allgemeine)
Streambufs sind marginal. Code gab's hier schon öfter. Spezielle
Sachen (wie Code-Translation nach Locale) wird z.B. nur für
Filebufs verlangt.
| Quote: | Ansonsten werde ich wohl dazu übergehen müssen, wieder C-Streams zu
verwenden und für den Rest eben jedes mal eine leicht andere
I/O-Implementierung (meinetwegen mit ein paar Wrapper-Klassen, um die
Code-Vermehrung in Grenzen zu halten). 8-(
|
Die C++-Streams bieten ja das gleiche wie die C-Streams, nur in
etwas passenderem Gewand. Immerhin sind die C++Streams in
äquivalenten C-Operationen beschrieben.
MfG
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Tue Jun 29, 2004 10:23 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> schrieb:
Das muß natürlich
if( se ) {
heißen.
--
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: Tue Jun 29, 2004 11:23 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
Florian Weimer <fw (AT) deneb (DOT) enyo.de> wrote
| Quote: | Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator
fuer benutzerdefinierte Typen?
Der Code sollte eine _vollständige_ Fehlerbehandlung aufweisen und in
demselben Verhalten resultieren wie die von der I/O-Bibliothek
mitgelieferten Operatoren.
|
Hallo Florian,
zu diesem Thema gibt es genau ein Werk (in Buchform):
Standard C++ IOStreams and Locales
von Angelika Langer, Klaus Kreft
Sprache: Englisch
Gebundene Ausgabe - 672 Seiten - Addison-Wesley Professional
Erscheinungsdatum: 31. Januar 2000
ISBN: 0201183951
Ein kleines Kapitel zum Thema gibt es auch bei Josuttis:
The C++ Standard Library: A Tutorial and Reference
von Nicolai M. Josuttis
Sprache: Englisch
Gebundene Ausgabe - 832 Seiten - Addison-Wesley Professional
Erscheinungsdatum: 1. August 1999
ISBN: 0201379260
Kapitel "Input/Output Operators for User-Defined Types" und folgende
...
... beide für deutschsprachige Leser leicht zu lesen, da alle Autoren
'native german speakers' sind.
| Quote: | Die libstdc++-v3-Quellen sind wegen der locale-Unterstützung leider
ziemlich schwer verständlich.
Als nächsten Schritt würde ich dann gerne selbst streambufs (oder wie
die heute heißen) implementieren, z.B. für bestimmte Formen von
Socket-I/O oder BLOBs in Datenbanken.
|
außer in der oben erwähnten Liteatur solltest Du auch einiges hier in
der ng und in comp.lang.c++.moderated finden. Suchwort 'streambuf'.
| Quote: | Ansonsten werde ich wohl dazu übergehen müssen, wieder C-Streams zu
verwenden und für den Rest eben jedes mal eine leicht andere
I/O-Implementierung (meinetwegen mit ein paar Wrapper-Klassen, um die
Code-Vermehrung in Grenzen zu halten). 8-(
... ich kann mir ehrlich gesagt nicht vorstellen, dass das einfacher |
ist, schon gar nicht mit der von Dir gewünschten '_vollständige_
Fehlerbehandlung'! Was verstehst Du eigentlich darunter? .. und was
ist ein C-Stream?
Gruß
Werner
--
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 |
|
 |
Dietmar Kuehl Guest
|
Posted: Wed Jun 30, 2004 12:28 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
""Philipp Bachmann" (<ed.soxi (AT) nnamhcab (DOT) ppilihp>) wrote:
| Quote: | Fuer Member Deiner Strukturen greifst Du auf schon existierende "operator<<()"
resp. "operator>>()" zu - auch diese koennen den Streamzustand veraendern.
Auch dieser Aspekt wird in Stroustrup kurz an einem Beispiel (Kap. 21.3.5
in meiner deutschen 3. Auflage von 1998) erlaeutert - es ist einfach
"stream.clear(ios_base::badbit);"
|
Allerdings ist 'badbit' nicht für Formatfehler, sondern für Fehler des
verwendeten IOStreams, insbesondere in Form von Exceptions, gedacht.
Formatfehler werden mittels 'failbit' signalisiert. Auch dieses Flag kann
ggf. in eine Exception gewandelt werden, wobei ich normalerweise den
Zustand von Streams direkt abfrage:
while (in >> whatever)
...;
if (!in.eof()) // Formatfehler nicht aufgrund von EOF
handle_error();
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting
--
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 |
|
 |
Dietmar Kuehl Guest
|
Posted: Wed Jun 30, 2004 12:51 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> wrote:
| Quote: | "Florian Weimer" <fw (AT) deneb (DOT) enyo.de> schrieb:
Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator
fuer benutzerdefinierte Typen?
Das geht etwa entlang folgender Zeilen:
template< typename Char, typename Traits
std::basic_istream< Char, Traits > operator >> (
^ |
An dieser Stelle fehlt ein '&': Streams können nicht kopiert werden.
| Quote: | std::basic_istream< Char, Traits > & is,
My my
|
Üblicherweise wird das auszugebene Objekt als const-Referenz übergeben:
My const& my
| Quote: | ){
bool ok = false;
try {
std::basic_istream< Char, Traits >::sentry se( is );
if( is ) {
// input code here
ok = true;
}
} catch( ... ) {
bool rethrow = false;
try { is.setstate( std::ios_base::badbit ); }
catch( ... ) { rethrow = true; }
if( rethrow ) throw;
}
if( !ok ) is.setstate( std::ios_base::failbit );
return is;
}
|
Ich habe zwar so ähnlichen Code auch schon geschrieben, aber das liegt
eigentlich nur da dran, dass ich die IOStreams-Library selbst implementiert
habe: alle anderen brauchen sowas eigentlich nur exterm selten zu machen.
Das übliche Verfahren für benutzerdefnierte Eingabe-Operatoren sieht eher
so aus, dass man die vordefinierten Operatoren verwendet, um komplexere
Datenstrukturen einzulesen. Die richtigen Fehlerflags werden weitgehen
automatisch gesetzt.
Die ganze 'sentry'-Mechanerie ist eigentlich nur notwendig, wenn man direkt
auf den zugrundeliegenden Stream Buffer zugreift, damit die üblichen
Konventionen eingehalten werden (überspringen von Whitespace, synchronisieren
von Buffern von assozierten OStreams, etc.). Die Operatoren für formatierte
Eingabe aus der Standardbibliothek machen das alles automatisch.
| Quote: | Ansonsten werde ich wohl dazu übergehen müssen, wieder C-Streams zu
verwenden und für den Rest eben jedes mal eine leicht andere
I/O-Implementierung (meinetwegen mit ein paar Wrapper-Klassen, um die
Code-Vermehrung in Grenzen zu halten). 8-(
|
Ich wüßte kein Beispiel, wo die C-Streams (ich vermute Du meinst die
Funktionen aus <stdio.h>) irgendwo Fehler besser behandeln. Der einzige
mir bekannte Vorzug von stdio sind Positionsargumente für I18N und das
ist auch nicht Teil des C-Standards (das gibt es nur X/Open oder so).
| Quote: | Die C++-Streams bieten ja das gleiche wie die C-Streams, nur in
etwas passenderem Gewand.
|
.... und mehr. Zum Beispiel kann man die externen Quellen erweitern (über
Stream Buffer), die Formatierung der [meisten] Basistypen ändern (über
Locales) und konsistent zu eingebauten Typen benutzerdefinierte Typen
behandeln.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Wed Jun 30, 2004 3:56 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
* Martin Kaul:
| Quote: | Such mal mit google nach "socketstream c++". Der zweite Eintrag
verweist auf ein Projekt bei sourceforge.net... Den Sourcecode
hab ich mal als Referenz für ne eigene Streamklasse verwendet...
|
Der Nomenklatur nach ist das sehr von der libstdc++-v3 inspiriert, es
ist also fraglich, wie portabel das ist (immerhin werden fast
ausschließlich reservierte Bezeichner verwendet). Wobei es mir im
wesentlichen nur um Portabilität auf neuere libstdc++-v3-Versionen
geht. 8-)
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Wed Jun 30, 2004 3:59 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
* reverse email address:
| Quote: | Stroustrup: TC++PL enthaelt m.E. alles, was Du brauchst - ein Anhang
der aktuellen Auflage behandelt zusaetzlich Lokalisierung.
|
Es fehlen einfach ein paar Beispiele, wie man operator<< in realen
Fällen implementiert. Die vorhandenen Beispiele sind alle IIRC
vereinfacht.
| Quote: | Zur "Fehlerbehandlung": M.E. ist dies hier ein irrefuehrendes
Wort. Bei der Eingabe geht es vielmehr darum, auf nichterwartete /
fehlerhafte Zeichen(-ketten) zu reagieren, indem man den Fehler
weiterreicht an den Aufrufer - "behandeln" kann man ihn bei der
Eingabe selbst nur in wenigen Faellen (das soll aber nicht heissen,
dass Du Deine Eingabefunktion nicht moeglichst robust bauen
solltest).
|
Irgendwie muß nun einmal mit Protokollfehlern umgegangen werden. Mein
Ziel ist dabei, das Verhalten von den bereits implementierten
Operatoren nachzuahmen, dann muß ich das nicht mehr extra
dokumentieren. 8-)
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Wed Jun 30, 2004 4:02 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
* Werner Salomon:
| Quote: | zu diesem Thema gibt es genau ein Werk (in Buchform):
Standard C++ IOStreams and Locales
von Angelika Langer, Klaus Kreft
Sprache: Englisch
Gebundene Ausgabe - 672 Seiten - Addison-Wesley Professional
Erscheinungsdatum: 31. Januar 2000
ISBN: 0201183951
|
Okay, dann werde ich mir das wohl beschaffen.
| Quote: | Ansonsten werde ich wohl dazu übergehen müssen, wieder C-Streams zu
verwenden und für den Rest eben jedes mal eine leicht andere
I/O-Implementierung (meinetwegen mit ein paar Wrapper-Klassen, um die
Code-Vermehrung in Grenzen zu halten). 8-(
.. ich kann mir ehrlich gesagt nicht vorstellen, dass das einfacher
ist, schon gar nicht mit der von Dir gewünschten '_vollständige_
Fehlerbehandlung'!
|
Doch, schon, weil C-Streams ein paar Zustände weniger haben.
| Quote: | Was verstehst Du eigentlich darunter?
|
Es geht darum, daß ich das ganze zum Parsen von einfachen Protokollen
einsetzen will, und ich Abweichungen von der Protokollspezifikation
irgendwie sauber abfangen muß, nach Möglichkeit sogar mit ein bißchen
Recovery. Bsiherige Versuche in dieser Richtung (erst mal einen String
einlesen (was funktioniert, da Whitespace einzelne Token trennt), dann
den String weiter auseinandernehmen) waren leider nicht besonders
performant.
| Quote: | .. und was ist ein C-Stream?
|
Ein Objekt, auf das eine FILE * zeigt.
--
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 |
|
 |
Florian Weimer Guest
|
Posted: Wed Jun 30, 2004 10:05 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
* Markus Schaaf:
| Quote: | "Florian Weimer" <fw (AT) deneb (DOT) enyo.de> schrieb:
Gibt es irgendwo (meinetwegen auch in Buchform) verstaendlichen
Referenzcode fuer die Implementierung von operator<< bzw. operator
fuer benutzerdefinierte Typen?
Das geht etwa entlang folgender Zeilen:
template< typename Char, typename Traits
std::basic_istream< Char, Traits > operator >> (
std::basic_istream< Char, Traits > & is,
My my
){
bool ok = false;
try {
std::basic_istream< Char, Traits >::sentry se( is );
if( is ) {
// input code here
ok = true;
}
} catch( ... ) {
bool rethrow = false;
try { is.setstate( std::ios_base::badbit ); }
catch( ... ) { rethrow = true; }
if( rethrow ) throw;
}
if( !ok ) is.setstate( std::ios_base::failbit );
return is;
}
|
Uh-oh. Okay, es ist weniger schlimm, als es ausschaut, aber die Frage,
wie man "// input code here" halbwegs effizient (und fehlerfrei
hinbekommt. Ich denke aber, daß das in dem IOStreams-Buch beschrieben
sein wird. Bislang verwende ich dort u.a. einen Input-Iterator, was
aber für Bulk-Daten nicht sehr effizient ist.
--
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 |
|
 |
Philipp Bachmann Guest
|
Posted: Thu Jul 01, 2004 6:33 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
| Quote: | Es geht darum, daß ich das ganze zum Parsen von einfachen Protokollen
einsetzen will, und ich Abweichungen von der Protokollspezifikation
irgendwie sauber abfangen muß, nach Möglichkeit sogar mit ein bißchen
Recovery. Bsiherige Versuche in dieser Richtung (erst mal einen String
einlesen (was funktioniert, da Whitespace einzelne Token trennt), dann
den String weiter auseinandernehmen) waren leider nicht besonders
performant.
|
Gib doch bitte ein Beispiel fuer Dein "einfaches Protokoll". Ich bin vermutlich
nicht allein damit, immer noch nicht genau zu verstehen, was Du vorhast.
Lass mich dennoch einen Verdacht aeussern: Dein Protokoll ist so flexibel,
dass es zur Serialisierung beliebiger Typen dienen kann, also etwa so:
"vectorOfInt 3 11 42 0 double 3.14". Die Erzeugung von der Instanzen
"std::vector< int >" und "double" wird i.d.R. _nicht_ von einem "operator>>()"
uebernommen, sondern etwa von einer parameterisierten Fabrik, die den
Stream oder zumindest den naechsten String als Parameter bekommt.
Anschliessend wird mit dem Stream und der neu generierten Instanz als
Parameter ein entsprechender "operator>>()" aufgerufen. Zumindest bei diesem
einfachen Protokoll gibt es - von einer Ausnahme abgesehen - keinen Grund,
Zunaechst eine ganze Zeile einzulesen oder auch zunaechst so zu tun, als waeren
alle Daten strings. Die Ausnahme sind mehrere Strings in Anfuehrungszeichen, die
als ein einziger String interpretiert werden sollen - aber auch in diesem Fall
koennte eine Protokollaenderung (d.h. eine Aenderung von "operator<<()")
den "operator>>()" viel einfacher machen - etwa wie in obigem Beispiel:
"3" ist die Laenge des Vektors, genauso koenntest Du angeben, wieviele Woerter
Du als ganzes wieder einlesen moechtest.
Cheers,
Philipp.
--
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 |
|
 |
Markus Schaaf Guest
|
Posted: Thu Jul 01, 2004 9:20 am Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
"Florian Weimer" <fw (AT) deneb (DOT) enyo.de> schrieb:
| Quote: | Uh-oh. Okay, es ist weniger schlimm, als es ausschaut, aber die Frage,
wie man "// input code here" halbwegs effizient (und fehlerfrei
hinbekommt. Ich denke aber, daß das in dem IOStreams-Buch beschrieben
sein wird. Bislang verwende ich dort u.a. einen Input-Iterator, was
aber für Bulk-Daten nicht sehr effizient ist.
|
Das angedeutete Beispiel zeigt, wie ungefähr die eingebauten
Operatoren arbeiten. Man sieht daran, was man evtl. vermeiden
möchte (z.B. viele solcher Operatoren in Folge aufzurufen), wie
man es selbst macht (falls man einen Low-Level-Operator braucht,
d.h. einen, der direkt auf den Stream-Buffer zugreift), und man
sieht, was man erwarten kann.
Wie Dietmar bereits bemerkte, sehen übliche benutzerdefinierte
Operatoren wesentlich einfacher aus:
struct MyClass {
int field1;
double field2;
};
std::ostream& operator<<( std::ostream& os, MyClass const& m ) {
return os << field1 << ' ' << field2;
}
std::istream& operator>>( std::istream& os, MyClass& m ) {
return is >> field1 >> field2;
}
Man behandelt keine Fehler zwischen den Elementen: falls der
Stream die Exceptions angeschaltet hat, ist sowieso alles prima,
weil bei einem Fehler die Operation beendet wird. Falls nur die
Status-Flags gesetzt werden, sind nachfolgende Ein- oder
Ausgaben (meist) No-Op's. Die Ausnahme wäre z.B. ein gesetztes
EOF-Flag, welches bei der nächsten versuchten Eingabe im Setzen
des Fail-Bits resultiert.
Vielleicht wäre es einfacher, an einem konkreten Beispiel Fragen
zu beantworten ... Wenn Performance entscheidend sein soll, wäre
zu schauen, wo es klemmt. Auch ist die Frage nach den zu
erwartenden externen Datenformaten ist interessant.
--
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 |
|
 |
Tommi Mäkitalo Guest
|
Posted: Sat Jul 10, 2004 6:49 pm Post subject: Re: I/O fuer eigene Objekte implementieren |
|
|
Markus Schaaf wrote:
| Quote: | "Florian Weimer" <fw (AT) deneb (DOT) enyo.de> schrieb:
.... |
| Quote: | bool ok = false;
try {
std::basic_istream< Char, Traits >::sentry se( is );
if( is ) {
// input code here
ok = true;
}
} catch( ... ) {
bool rethrow = false;
try { is.setstate( std::ios_base::badbit ); }
catch( ... ) { rethrow = true; }
if( rethrow ) throw;
}
.... |
Mal ne einfache Frage: Wozu dieser catch und rethrow-Flag?
Wenn ich das richtig sehe, ist das doch identisch mit:
try {
std::basic_istream< Char, Traits >::sentry se( is );
if( is ) {
// input code here
ok = true;
}
} catch( ... ) {
is.setstate( std::ios_base::badbit );
}
Tommi
--
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
|
|