Ich versuche so viele std::complex<double>
wie möglich aus einer Datei (oder einem beliebigen std::istream
) zu lesen. Wenn die Operation fehlschlägt, suche ich nach ios :: eof (). Wenn es nicht festgelegt wurde, nehme ich an, dass beim Analysieren der Daten ein Fehler aufgetreten ist, und ich kann dem Benutzer melden, dass die Eingabedatei Fehler enthält. Dieses Schema funktioniert doppelt, aber irgendwie scheitert es an komplexen Zahlen. Warum?
Hier ist ein Code, um das Problem zu reproduzieren:
%Vor%Die Ausgabe ist
%Vor% Wenn ich std::complex<double>
durch double
ersetze, funktioniert es wie erwartet und ergibt
Dieses Problem tritt bei libstdc ++ auf, scheint aber mit libc ++ zu funktionieren:
läuft auf coliru mit clang ++ und libc ++
BEARBEITEN Ich habe einen Fehlerbericht von 2013 gefunden, aber der Problem scheint immer noch da zu sein, und die Bibliothek ist ziemlich üblich. Gibt es eine Möglichkeit für mich, dass es für jeden funktioniert, ohne meinen eigenen Parser schreiben zu müssen?
Es stammt aus dem Standardwortlaut:
[complex.ops]
12 Effekte : Extrahiert eine komplexe Zahl x des Formulars: u , (u) oder (u, v) , wobei u der reelle Teil und v das Imaginäre ist Teil (27.7.2.2).
13 Benötigt : Die Eingabewerte sollen inT
konvertierbar sein. Wenn eine fehlerhafte Eingabe auftritt, ruftis.setstate(ios_base::failbit)
auf (wasios::failure
(27.5.5.4) auslösen kann).
14 Gibt zurück:is
.
15 Bemerkungen : Diese Extraktion wird als eine Reihe von einfacheren Extraktionen durchgeführt. Daher wird das Überspringen von Leerzeichen so festgelegt, dass es für jede der einfacheren Extraktionen gleich ist.
Insbesondere wird nicht angegeben, dass in jedem Fall eofbit
gesetzt werden soll. Selbst Bemerkung spezifiziert nicht, welche Operationen durchgeführt werden und was ihre Semantik ist. Es gibt einen Fehlerbericht , der eine Auflösung durch Spezifizierung der Semantik der Operation und, wenn wir Glück haben, wird es seinen Weg nach C ++ 17 finden.
Tags und Links c++ complex-numbers std eof istream