2009-09-10 4 views
5

Ich suche ein gutes Beispiel dafür, wie man den Stream-Eingabeoperator (Operator >>) überlädt, um einige Daten mit einfacher Textformatierung zu parsen. Ich habe this tutorial gelesen, aber ich möchte etwas etwas fortgeschrittener machen. In meinem Fall habe ich Strings festgelegt, nach denen ich suchen möchte (und ignorieren). das 2D-Punkt-Format von den Verbindungs ​​Gesetzt waren eherBeispiel für das Überladen von C++ - Extraktionsoperator >> zum Analysieren von Daten

Point{0.3 => 
     0.4 } 

wo der beabsichtigte Effekt ist, die Zahlen 0,3 und 0,4 parsen. (Ja, das ist eine schrecklich dumme Syntax, aber es enthält mehrere Ideen, die ich brauche). Meistens will ich nur, um zu sehen, wie man richtig auf das Vorhandensein von festen Strings zu überprüfen, Leerzeichen ignorieren usw.

Update: Hoppla, Kommentar, den ich unten keine Formatierung hat (dies ist mein erstes Mal dieser Seite). Ich fand, dass Leerzeichen

std::cin >> std::ws; 

Und für das Essen bis Strings mit so etwas wie

übersprungen werden kann Ich habe

static bool match_string(std::istream &is, const char *str){ 
    size_t nstr = strlen(str); 
    while(nstr){ 
     if(is.peek() == *str){ 
      is.ignore(1); 
      ++str; 
      --nstr; 
     }else{ 
      is.setstate(is.rdstate() | std::ios_base::failbit); 
      return false; 
     } 
    } 
    return true; 
} 

Jetzt wäre es schön, in der Lage sein, die Position (Zeilennummer) eines bekommen Parsingfehler.

Update 2: Haben Zeilennummern und Kommentar-Parsing funktioniert, mit nur 1 Zeichen Look-Ahead. Das Endergebnis kann hier in AArray.cpp, in der Funktion parse() gesehen werden. Das Projekt ist eine (de) serialisierbare C++ - PHP-artige Array-Klasse.

+0

Es ist nicht die "Extraktion" oder "Stream-Eingabe" -Operator, es ist der "Bit-Shift" -Operator. Die Stream-IO-Versionen sind selbst überlastete Versionen des ursprünglichen C-Operators, der in der Praxis relativ wenig genutzt wird. –

+1

Chris: Obwohl ich nicht mit Ihnen nicht einverstanden bin, scheint es gängige Praxis zu sein, die Operatoren '>>' und '<<' unabhängig voneinander als "Stream-Input/Output" -Operatoren zu bezeichnen. Siehe Stroustrups Glossardefinitionen von << and >>: http://www.research.att.com/~bs/glossary.html – GRB

+1

@GRB: Operatorüberladung ist nicht. Der bitweise Rechtsverschiebungsoperator wurde von der C++ stl missbraucht. Betrachte Operator ^. Sie könnten sich dafür entscheiden, das Überladen von Operatoren zu verwenden, um es zu einem Raise-to-the-Power-Operator zu machen. Es hat jedoch einfach die falsche Priorität und Assoziativität. Angesichts der Tatsache, dass neuartige neue Operatoren nicht hinzugefügt werden können und die Semantik existierender Operatoren nicht geändert werden kann, UND die implizite Mechanik in der Terminologie: "Überladung" ist Operator der bitweise rechte Verschiebungsoperator und alles andere wird als überladene Form verstanden . –

Antwort

1

Ihre Betreiber >> (istream &, Objekt &) sollten die Daten aus dem Eingangsstrom erhalten, seine formatiert und/oder unformatiert Extraktionsfunktionen, und es in Ihrem Objekt stecken.

Wenn Sie (nach einiger Zeit) sicherer sein wollen, konstruieren und testen Sie ein istream :: sentry-Objekt, bevor Sie beginnen. Wenn ein Syntaxfehler auftritt, können Sie setstate(ios_base::failbit) aufrufen, um eine andere Verarbeitung zu verhindern, bis Sie my_stream.clear() aufrufen.

Beispiele siehe <istream> (und iStream.tcc, wenn Sie SGI STL verwenden).

Verwandte Themen