Auslesen von komplexen Zahlen aus einer Datei
-
Werner Salomon: Wieder einmal ein sehr guter Beitrag von dir, der zu schade ist, um in der Versenkung zu verschwinden. Was hälst du davon, deine Lektionen als Artikel zu veröffentlichen? Wenn du willst, kann ich dir die Arbeit auch abnehmen.
-
Werner Salomon:
Mir kam da eine komische Idee. Also klar, erst eine ganze Zeile schnell zu lesen, sie in einen string zu kopieren, den in einen stringstream zu kopieren und dann nochmal zu lesen, das hat unnötige Kopierkosten.
Aber es ist oft so einfach...
Anfänger und ich mögen das.Könnte man statt
for(int p=0; p<21525; p++){ getline(f, s); istringstream ss(s); //parsen von ss }sowas wie
for(int p=0; p<21525; p++){ igetline_proxy ss(f); //parsen von ss, ganz unverändert }machen, wobei ss keine Kopie der Daten haben muß, sondern nur weiterleitet auf den ehrlichen streambuffer des files?
este Idee: Der Destruktor des igetline_proxy muß den eigentlichen istream noch lesen, bis er gegen eof oder einen Zeilenumbruch läuft, damit es sich so anfühlt, als hätte man vorher die ganze Zeile gelesen.
-
Oder man nimmt einfach meine Lösung. Die ist super kurz. Und noch viel superer einfach!

-
314159265358979 schrieb:
Oder man nimmt einfach meine Lösung. Die ist super kurz. Und noch viel superer einfach!

Ein Lob an die transzendente Zahl.
-
314159265358979 schrieb:
Oder man nimmt einfach meine Lösung. Die ist super kurz. Und noch viel superer einfach!

Welche genau?
-
314159265358979 schrieb:
template <typename Iter> std::complex<double> parse_complex(Iter begin, Iter end) { using namespace boost::spirit::qi; using boost::phoenix::ref; double real, imag = 0; char sign; if(!phrase_parse(begin, end, double_[ref(real) = _1] >> -((char_('+') | char_('-'))[ref(sign) = _1] >> 'j' >> double_[ref(imag) = _1]), ascii::space) || begin != end) throw parse_error("parse error here: " + std::string(begin, end)); return std::complex<double>(real, sign == '-' ? -imag : imag); }Um eine Lösungsmöglichkeit zu posten.
Die hier.

-
Fehlt nur noch ein "Ich bin es".
-
314159265358979 schrieb:
...
Ach, nö.
-
Findet aber alle Fehler im Format :p
(Zugegebenermaßen aber kein ernsthafter Lösungsvorschlag. Wollte nur eine möglichst kurze Lösung hinbekommen.)
-
Du wolltest also einfach allen Anwesenden (Mitlesenden?) demonstrieren, dass du es einfach übermäßigst draufhast.
Etwas anderes war ja kaum zu erwarten
-
mh. schrieb:
Du wolltest also einfach allen Anwesenden (Mitlesenden?) demonstrieren, dass du es einfach übermäßigst draufhast.
Etwas anderes war ja kaum zu erwarten

@Pi, wenn du cool sein willst, bist du hier falsch.
-
volkard schrieb:
Also klar, erst eine ganze Zeile schnell zu lesen, sie in einen string zu kopieren, den in einen stringstream zu kopieren und dann nochmal zu lesen, das hat unnötige Kopierkosten.
Aber es ist oft so einfach...
Anfänger und ich mögen das... kommt mir manchmal vor, wie die dunkle Seite der Macht - so schön verführerisch
(s. auch unten)volkard schrieb:
Könnte man statt
for(int p=0; p<21525; p++){ getline(f, s); istringstream ss(s); //parsen von ss }sowas wie
for(int p=0; p<21525; p++){ igetline_proxy ss(f); //parsen von ss, ganz unverändert }machen, wobei ss keine Kopie der Daten haben muß, sondern nur weiterleitet auf den ehrlichen streambuffer des files?
este Idee: Der Destruktor des igetline_proxy muß den eigentlichen istream noch lesen, bis er gegen eof oder einen Zeilenumbruch läuft, damit es sich so anfühlt, als hätte man vorher die ganze Zeile gelesen.
Ja .. die Idee ist gar nicht so neu. Wobei gar nicht der Stream ausgetauscht werden sollte. Dann hat man die selben Nachteile wie bei der getline-istringstream-Kombination. Der konkrete istream enthält alle Informationen (auch die nachträglich eingestellten); erzeugt man einen neuen, so gehen alle Nicht-Standard-Einstellungen verloren.
Was man machen könnte, wäre so einen getline_filter zwischen den Stream und den darunter liegenden streambuf zu schalten, aus dem man denn 'gegen EOF' lesen kann, was wesentlich einfacher ist, als 'gegen EOL' zu lesen. Dieser getline_filter könnte dann in seinem Destruktor alle Zeichen bis EOL des Original-streambuf überlesen - falls noch welche anstehen.
Ich hatte auch schon mal ein Beispiel dafür gepostet, finde es aber nicht mehr wieder.Gruß
Werner