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)


Anmelden zum Antworten