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-27

    Ich 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 falsch

    ofstream 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! 🙂


Anmelden zum Antworten