Warum setzt der Operator auf complexdouble eofbit nicht, wenn EOF erreicht wird?

9

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

%Vor%

Dieses Problem tritt bei libstdc ++ auf, scheint aber mit libc ++ zu funktionieren:

laufen auf coliru mit g ++

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?

    
dennis 16.06.2016, 12:45
quelle

1 Antwort

1

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 in T konvertierbar sein. Wenn eine fehlerhafte Eingabe auftritt, ruft is.setstate(ios_base::failbit) auf (was ios::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.

    
Revolver_Ocelot 16.06.2016, 13:24
quelle

Tags und Links