operator >>
-
hallo leute
ich lerne c++ und versuche nun für eine klasse den operator >> zu definieren. ich habe den operator << schon gemacht:
class Bruch { public: int Zaehler; int Nenner; } ostream& operator <<(ostream& Stream, Bruch bruch) { Stream << bruch.Zaehler << "/" << bruch.Nenner; return Stream; }
damit kann ich einen bruch z.b. in eine datei speichern. später will ich ihn wieder aus der datei auslesen, dafür brauch ich einen operator >>. wie programmier ich den am besten?
-
Was hast du versucht?
-
Den implementierst du eigentlich genauso wie du den Ausgabeoperator definierst.
-
meint ihr so?
istream& operator >>(istream& Stream, Bruch& bruch) { Stream >> bruch.Zaehler >> "/" >> bruch.Nenner; return Stream; }
das funktioniert leider nicht wegen dem "/". soll ich es einfach in eine char variable einlesen und prüfen ob es gleich dem / ist?
-
jonassss schrieb:
meint ihr so?
istream& operator >>(istream& Stream, Bruch& bruch) { Stream >> bruch.Zaehler >> "/" >> bruch.Nenner; return Stream; }
das funktioniert leider nicht wegen dem "/". soll ich es einfach in eine char variable einlesen und prüfen ob es gleich dem / ist?
Ja
-
Man kann auch einen eigenen <<-Operator für die Stringliterale implementieren:
istream& operator >>(istream& stream, const char *literal) { while (*literal) if (stream.get() != *literal++) { stream.clear(ios::failbit); break; } return stream; }
so daß dann auch z.B.
stream >> "/";
funktioniert: Ideone-Code
-
Solltest du das failbit nicht lieber verodern? Ansonsten clearst du z.B. bei eof das eofbit. Also sowas:
stream.clear(stream.rdstate() | ios::failbit)
-
wob schrieb:
Also sowas:
stream.clear(stream.rdstate() | ios::failbit)
Auch genannt
std::ios::setstate
.
-
Du hast natürlich recht, dass setstate besser ist!
Allerdings meiner Meinung nach sind beides furchtbare Namen! Bei clear(failbit) denke ich eher daran, dass das failbit gelöscht wird (also rdstate &= !failbit) und bei setstate würde ich auch nicht auf die Idee kommen, dass da ein oder hinter sitzt.
-
Ja, das wäre wohl besser (ich hatte nur noch clear in Erinnerung, und da dort auch kein Verweis auf setstate ist, habe ich nicht weiter darüber nachgedacht).
Also noch mal verbessert:
istream& operator >>(istream& stream, const char *literal) { while (*literal) if (stream.get() != *literal++) { stream.setstate(ios::failbit); break; } return stream; }
(da ich das jetzt nur mal auf die Schnelle hingeschrieben habe, wären sicherlich noch weitere Verbesserungen bzgl. Standardkonformität möglich)