2016-08-29 7 views
-1

ich eine Textdatei haben, die ersten paar Zeilen beschreibt und beschreibt dann einige bunte Linien:std :: cin mit komplexeren Objekten

1 2 3 4 
5 6 7 8 
9 10 11 12 

red 1 0 0 1 2 3 4 
green 0 1 0 5 6 7 8 
blue 0 0 1 9 10 11 12 

Die Anzahl der Zeilen in jedem Abschnitt ist unbekannt zum Zeitpunkt der Ausführung
ich überlastet die std::cin >> Betreiber für diese structs:

struct Point { int x, y; } 
struct Line { Point a, b; } 
struct Color { float r, g, b; std::string name; }; 
struct ColorfulLine { Line line; Color color; }; 

(Voll Beispiel hier: http://ideone.com/bMOaL1 [bereits funktioniert - bearbeitet die Zube nach PTED Antwort])
Jetzt muss ich über die Datei iterieren Lines und ColorfulLines mit:

Line line;              
while(cin >> line) { cout << "We've got a line!\n"; }    

ColorfulLine color_line;           
while(cin >> color_line) { cout << "We've got a colorful line!\n"; } 

// actually I'm putting them into std::lists but I skipped this part for simplicity 

Und hier ist das Problem - die bunten Linien sind nie geholt, das heißt die zweite Schleife wird nicht ausgeführt.

Ich habe eine Vermutung, warum kommt es vor, aber nicht wissen, wie es zu beheben:
Wenn std::cin versucht, die vierte Zeile zu holen, scheitert es daran, dass statt einer Nummer die Zeichenfolge „red“ gibt.
Als nächstes versucht std :: cin in der zweiten while-Schleife eine Zeichenfolge (Color.name) zu lesen, sieht aber eine Zahl und schlägt dann auch fehl.

Ich habe versucht, einige zufällige Wort vor dem Abschnitt ColorfulLines setzen, in der Hoffnung, dass, wenn die erste Schleife fehlschlägt, die zweite beginnt, von der "roten" Zeichenfolge zu lesen, aber es nicht.

Wie behebt man das?

+0

Erläuterung der Gründe für den downvote geschätzt wird zurückgesetzt. –

+0

Ich habe keinen Downvote gemacht, aber ich wette, es liegt daran, dass Sie den relevanten Code nicht in Ihrer Frage, sondern direkt an Ihrer Stelle gepostet haben. (Bitte nicht in der Zukunft tun.) – ildjarn

+0

@ildjarn der relevante Code ist alles in der Frage, übersprang ich nur die '>>' Operatorüberladung, die ich hier unnötig finden. (und natürlich int Haupt- und Co.). Liege ich falsch? Ich dachte, es wäre besser, wenn ich hier nur die wichtigsten Teile und nicht den ganzen Müll rauslasse. –

Antwort

5

Nachdem die erste Schleife unterbrochen wurde, befindet sich std::cin in einem schlechten Zustand. Deshalb bricht die Schleife an erster Stelle. Das Ausführen von Lesevorgängen bei einem fehlerhaften Stream schlägt sofort fehl, sodass die zweite Schleife nie eingegeben wird.

Um dies zu lösen, den Fehlerzustand nach der ersten Schleife bricht mit

std::cin.clear();