2016-11-04 3 views
0

Ich bin mir ziemlich sicher, dass ich den Code für die beiden Funktionen in meiner Klasse falsch geschrieben habe. Ich bin verwirrt, wie man nur die zwei Stücke der Daten richtig (x und y) aufnimmt und stellt sicher, dass sie in einem guten Zustand sind.Confused So stellen Sie sicher, dass die Daten in IOStream "gut" sind

/** 
* Requires: ins is in good state. 
* Modifies: ins, x, y. 
* Effects: Reads point in form (x,y). 
*/ 
void read(istream& ins); 

/** 
* Requires: outs is in good state. 
* Modifies: outs. 
* Effects: Writes point in form (x,y). 
*/ 
void write(ostream& outs); 


void Point::read(istream& ins) { 
char junk; 
char junk2; 
char junk3; 
while (cin.good()) { 
    cin >> junk >> x >> junk2 >> y >> junk3; 
} 
} 

void Point::write(ostream& outs) { 
while (cout.good()) { 
    cout << "(" << x << "," << y << ")"; 
} 
} 
+0

Was ist 'x' und' y'? –

+0

Sie sind die Punkte in einer Koordinate (x, y). – NICE8xxx

+0

Ah ha. Du hast mich jetzt vollkommen erleuchtet. Veröffentlichen Sie bitte ein [MCVE], das Ihr tatsächliches Problem nach Bedarf wiedergibt? –

Antwort

0

Sie können istream's .bad() Funktion nach dem Lesen verwenden, um festzustellen, ob ein Problem war. "Probleme könnten Logischer Fehler bei der E/A-Operation sein" (Failbit) oder "Lese-/Schreibfehler bei E/A-Operation" (Badbit).

Unten habe ich cin durch ins ersetzt, da Sie es als Argument übergeben haben und es eindeutig das Objekt istream ist, das Sie extrahieren müssen. Ich habe auch lokale Variablen hinzugefügt (mit einem Unterstrich als Präfix), dann nur auf x und y kopieren, wenn es keinen Fehler gab.

Wenn ein Fehler erkannt wird, können Sie einfach "zurückgeben", jedoch würde Ihrem Benutzer kein Hinweis darauf angezeigt, dass ein Lesefehler aufgetreten ist und x/y nicht berührt wurden. Als Alternative habe ich gewählt, um eine Ausnahme zu werfen, aber Sie könnten auch wählen, cout/cerr eine Nachricht, dann zurückgeben, oder wählen Sie das Ergebnis (Erfolg/Fehler) anstelle der Verwendung einer void zurückgeben und lassen Sie die aufrufende Funktion Behandeln Sie den Fehler.

void Point::read(istream& ins) { 
    char _junk; 
    int _x, _y; 

    ins >> _junk >> _x >> _junk >> _y >> _junk; 

    if (ins.bad()) 
    throw "Error"; 

    x = _x; // Assuming x and y are members of class Point 
    y = _y; 
} 

Für die Point::write Funktion, nicht mit der while-Schleife stören. Normalerweise überprüfe ich Ostream-Objekte nicht, aber wenn du das wirklich willst, dann überprüfe einfach, ob vor und nach dem Schreiben wahr ist. Wenn Sie ein Problem feststellen, können Sie den Fehler so behandeln, wie Sie möchten. return, throw eine Ausnahme und/oder protokollieren Sie den Fehler.

Verwandte Themen