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 habestatic 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.
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. –
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
@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 . –