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