float-Wert speichern/auslesen - Problem
-
Hi. Hab grad ein ziemlich komisches Problem:
Ich versuche verweifelt, einen Float-Wert in eine Datei zu schreiben und ihn wieder auszulesen.Code denkbar einfach:
ofstream fout ("test.txt"); fout.clear (); float f = 2.3f; fout << f; fout.write ((char*)&f, sizeof (float)); fout.close(); ifstream fin ("test.txt"); float f2; fin >> f2; cout << "ifstream::operator <<: " << f2 << endl; float f3 = 0; fin.read ((char*)&f3, sizeof (float)); cout << "ifstream::read: " << f3 << endl;Ausgabe:
ifstream::operator <<: +0x0.000000p+0
ifstream::read: +0x1.5c62f0p-27Ich weiß nicht was zum henker das soll. Und in der Hilfe hab ich auch nix gefunden.
-
Sieht auf den ersten Blick korrekt aus...
-
ja alles richtig bis auf das eine kleine Detail dass das Ergebnis nicht stimmt. *gg*
-
gloebl schrieb:
ja alles richtig bis auf das eine kleine Detail dass das Ergebnis nicht stimmt. *gg*
Du musst den ofstream im Binary-Mode öffnen:
ofstream fout ("test.txt", ios::binary);Edit: Den ifstream natürlich auch.
-
nein bringt nix.
andere datentypen funktioniern übrigens perfekt
-
gloebl schrieb:
andere datentypen funktioniern übrigens perfekt
Kann ich mir nicht vorstellen. Entweder, Du schreibst ASCII in das File (mit << / >>), oder Du schreibst die binäre Repräsentation ins File. Beides zusammen geht nicht und macht auch wenig Sinn.
-
beides gleichzeitig war auch nur ein verzweifelter test weil << nicht geklappt hat
-
Das hier funktioniert!!
per read und write. << und >> machen scheinbar irgendwas falschofstream fout ("test.txt"); fout.clear (); float f = 2.3f; fout.write ((char*)&f, sizeof (float)); fout.close(); ifstream fin ("test.txt"); float f3 = 0; fin.read ((char*)&f3, sizeof (float)); cout << (f3 == 2.3f) << endl; cout << "ifstream::read: (ios::fixed)" << fixed << f3 << endl; cout << "ifstream::read: " << f3 << endl;Ausgabe:
true
ifstream::read: (ios::fixed)+2.300000
ifstream::read: +2.300000
-
wenn du ein flag setzt, musst du es danach auch wieder zurücksetzten
cout << resetiosflags(ios::fixed);
-
jaja. aber worums mir erstmal ankam war die Erkenntnis dass <</>> mit float und double nicht funktionieren.
das ios::fixed ist garnicht nötig.EDIT:
ich mein damit, dass es mir weniger um die korrekte ausgabe geht als dass die Variable den richtigen Wert bekommt.
-
gloebl schrieb:
<< und >> machen scheinbar irgendwas falsch
gloebl schrieb:
jaja. aber worums mir erstmal ankam war die Erkenntnis dass <</>> mit float und double nicht funktionieren.
Du hast Recht, die Standardbibliothek wird hier wohl einen Bug haben...

-
Vielleicht hat seine Implementierung ja einen. Kann doch sein!
