sgetc sbumpc snextc und eof
-
hola leute
wenn ich z.b. mit snextc nen character hole und ich eof bekomme, muss ich dann von hand das eofbit im istream setzen oder wird das vom streambuf uebernommen ?
Meep Meep
-
Meep Meep schrieb:
wenn ich z.b. mit snextc nen character hole und ich eof bekomme, muss ich dann von hand das eofbit im istream setzen oder wird das vom streambuf uebernommen ?
Ja - Du musst selbst das eofbit setzen, und ggf. das badbit, falls der streambuf eine Exception wirft. Der streambuf selbst kann das gar nicht, da es keine Verbindung vom streambuf-Objekt zum Stream-Objekt gibt. Die Assoziation ist immer umgekehrt, Stream->streambuf.
Das failbit setzt Du beim lesenden Stream genau dann, wenn das was da gelesen werden soll, aus Format-Gründen nicht geht oder dem zu lesenden Objekt nicht zugeordnet werden kann. Beispiel: Du möchtest eine Zahl bestehend aus Ziffern lesen, aber findest als erstes Zeichen einen Buchstaben vor.
Gruß
Werner
-
danke mal fuer die antwort.
welche exception sollte vom streambuf geworfen werden ?Meep Meep
-
Hier ist ein Beispiel von Werner, vielleicht hilft Dir das: http://www.c-plusplus.net/forum/p2267197#2267197
Vielleicht überwältigt es Dich auch, aber was soll's.
-
Meep Meep schrieb:
welche exception sollte vom streambuf geworfen werden ?
Jede erdenkliche. Ein std::streambuf ist nur eine Schnittstelle mit ein wenig Basisfunktionalität.
Dahinter kann sich irgendein Zeichen lieferndes (oder konsumierendes) Objekt (bzw. Device) befinden, die mit allen möglichen Problemen konfrontiert werden kann. CDs die unterm Lesen ausfahren, ein Netzwerk, bei dem der Stecker gezogen wird oder ein Treiber, der einfach seinen Dienst aufgibt. In jedem Fall kann (muss nicht) eine Exception geworfen werden.
Gruß
Werner
-
hola
waere das ein eine korrekte implementierung die alles abdeckt ?
(nein ich erfinde das rad nicht neu, ist nur zur uebung)template<class CHAR> inline bool read_line(txl::istream_iterator<CHAR> &iter, const txl::istream_iterator<CHAR> &end, std::basic_string<CHAR> &str, const CHAR c = '\n') { while(iter != end && *iter != c) { str.append(1, *iter); ++iter; } if(iter != end) ++iter; return iter != end; } template<class CHAR> inline std::basic_istream<CHAR>& read_line(std::basic_istream<CHAR> &is, std::basic_string<CHAR> &str, const CHAR c = '\n') { if(!is.good()) return is; txl::istream_iterator<CHAR> iter(is), end; try { if(read_line(iter,end, str, c) == false) { is.setstate(std::ios_base::eofbit); } } catch(...) { if(is.exceptions() & std::ios_base::badbit) throw; else is.setstate(std::ios_base::badbit); } return is; }Meep Meep
-
Meep Meep schrieb:
waere das ein eine korrekte implementierung die alles abdeckt ?
Hallo Meep Meep,
Um kurz zu antworten - nein.
Schau Dir mal diesen Thread an, wo ich mich zum Lesen auf Streambuf-Ebene auslasse.Die wichtigsten Dinge sind: es fehlt das sentry-Objekt und Du solltest nicht innerhalb des try-catch-Blocks setstate aufrufen, weil das könnte wieder eine Exception werfen.
Gruß
Werner