istream überladung



  • Hi,

    steh hier vor folgendem problem (operatorüberladung):

    ich muss den operator >> überladen, was auch kein thema sein dürfte. nur geht es darum, eine folge in folgendem format einzulesen:
    <1,2,3,4,5,...>
    wie ist es möglich, dass ich die zeichen "<", "," und ">" von der konsole einlesen lassen kann?
    hier meine funktion, die so noch nicht funktioniert 🙂 :

    istream& operator>>(istream& In, CFolge& eingabe)
      {	
       In >> "<";
       for(unsigned int i=0; i<eingabe.dim; i++)
         {
          In >> eingabe.folge[i] >> ",";
          eingabe.last++;
         }
       In >> ">";
    
       return In;
      }
    

    MastaZulu



  • istream& operator>>(istream& in, CFolge& eingabe)
    {
      if (in.peek() != '<')
      {
        in.setstate(ios::failbit);
        return in;
      }
      in.get();
    
      // jetzt ist das '<' weg - analog mit '>'
    

    Tntnet



  • hm, gibts da nichts standardmäßiges direkt für cin oder sowas, das nicht so "kompliziert" ist?



  • würde dir ja gerne helfen aber hab net ganz kapiert was du willst



  • also:

    ich würde gerne eine mathematische folge (<1,3,5,2,4,7,...>) einlesen lassen und mit dieser dann rechnen.
    jedoch müssen wir den eingabeoperator überladen (siehe oben).

    mein problem ist, ich schreibe alles in einen int-array, soll aber die folge in folgendem format eingeben lassen können:
    <1,2,3,4,...>
    also mit den eckigen klammern und die werte mit kommas getrennt...
    wie kann ich das machen?



  • Also hier sehe ich keine Möglichkeit die von der standardbibliothek unterstützt wird. Ich würde die Zeichenfolge einfach in einen String einlesen und ihn dann zerlegen.



  • MastaZulu schrieb:

    hm, gibts da nichts standardmäßiges direkt für cin oder sowas, das nicht so "kompliziert" ist?

    Es gibt nichts besseres. Das ist doch auch nicht kompliziert.

    Um den code zu erläutern: in.peek() schaut, was als nächstes kommt. Ist es kein '<', wird der Fehlerflag gesetzt und rausgesprungen. Das ist einfach umgangssprachlich das, was ich codiert habe.

    Du könntest Dir natürlich noch eine kleine helper-funktion schreiben:

    inline void skip_char(istream& in, char ch)
    {
      if (in.peek() != ch)
        in.setstate(ios::failflag);
      else
        in.get();
    }
    

    Dann reduziert sich Deine Funktion auf:

    istream& operator>>(istream& in, CFolge& eingabe)
    {
      skip_char(in, '<');
      for(unsigned int i=0; i<eingabe.dim && in; i++, eingabe.last++;)
      {
        in >> eingabe.folge[i];
        ignore_char(in, ',');
      }
      ignore_char(in, '>');
      return in;
    }
    

    Ich habe hier auch gleich die Reaktion auf Eingabefehlern verbessert.

    Tntnet



  • alles klar, danke für die hilfe!

    MastaZulu


Anmelden zum Antworten