Union mit float Problem



  • Hi,

    Wie kann ich in einer Datei Float-Werte abspeichern? Ich möchte gern, dass die Floats in ein *char "übersetzt" wird und so direkt ins File geschrieben wird. Muss ich das im Binary-Mode machen?

    Ich bin für jede Hilfe dankbar 🙂

    Hier mein Code:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    union trans
    {
        float f;
        char c[sizeof(float)];
    };
    
    void write_float2file(char *path, trans *t)
    {
        fstream datei;
        datei.open(path, ios::out | ios::app);       //Zum schreiben oeffnen, anhaengen
    
        cout << sizeof(float) << endl;
    
        if(!datei)
            cout << "Datei kann nicht geoeffnet werden!" << endl;
        else
        {
            datei << t->c;
        }
    
        datei.close();
    }
    
    void read_file2float(char *path)
    {
        fstream datei;
        datei.open(path, ios::in);                  //Zum lesen oeffnen
        trans temp;
    
        int i = 0;
    
        if(!datei)
            cout << "Datei kann nicht geoeffnet werden!" << endl;
        else
        {
            do
            {
                datei.get(temp.c, sizeof(float));  //groesse eines Floats einlesen
                cout << temp.f << endl;
            }while(!datei.eof());
        }
    
        datei.close();
    
    }
    
    int main()
    {
        trans transfer;
    
        transfer.f = 12345.789;
    
        cout << "Float betraegt: " << transfer.f << endl;
    
        cout << "Float unformatiert in Datei abspeichern..." << endl;
        write_float2file("C:\\bla\\float.txt", &transfer);
    
        transfer.f = 9876.2458;  //Ein zweiter Float abspeichern
        write_float2file("C:\\bla\\float.txt", &transfer);
    
        cout << "Float unformatiert aus Datei lesen..." << endl;
        read_file2float("C:\\bla\\float.txt");  //Alle Float in der Datei auslesen
    
        return 0;
    }
    


  • Ist zwar ne ANSI-C Lösung, aber hauptsache es funktioniert 😉

    char hilf[10];
    float zahl=1.234567;
    
    sprintf(hilf, "%f", zahl);
    

    Nun steht in hilf die Zeichenfolge 1.234567 drin



  • Danke für den Tipp, aber ich möchte schon gern wissen was ich falsch gemacht habe mit dem Union. Es muss mit dem Union genau so klappen 😕



  • 🙂

    \0

    Mehr brauch ich wohl nicht zu sagen, oder?



  • warum so kompliziert wenn es auch einfach und besser (portabler) geht?

    #include <fstream>
    #include <iostream>
    
    void write(float f) {
      std::ofstream out("flout.f");
      out << f;
    }
    
    void read(float &f) {
      std::ifstream out("flout.f");
      out >> f;
    }
    
    int main() {
      float f0=1.2345;
      write(f0);
      float f1;
      read(f1);
      std::cout << f0 << " == " << f1 << " : " << (f0==f1) << std::endl;
    }
    


  • Danke für eure Tipps 🙂

    Dieser Code den ich hier geschrieben habe, kommt in kein Programm. Es geht mir rein ums Verständnis.

    AJ schrieb:

    🙂

    \0

    Mehr brauch ich wohl nicht zu sagen, oder?

    Wo hab ich den das \0 vergessen?

    Wäre wirklich Super, wenn mir jemand meinen Fehler mit mitteilt 👍



  • Wo hab ich den das \0 vergessen?

    na in deiner union.

    Angenommen ein float hat vier Byte, dann ist dein char-Feld eine Größe von vier, die alle komplett belegt werden, ohne \0, was ein fünftes Byte belegen würde.

    Außerdem macht die ganze union-Geschichte nicht so wirklich Sinn. Wenn du tatsächlich eine binäre Darstellung erreichen möchtest, öffne die Datei im Binärmodus.



  • Danke 👍
    Das EOS hab doch wirklich völlig vergessen.
    Jetzt kann ich schonmal den ersten Wert auslesen. Aber die folgenden Wert wolle einfach nicht richtig angezeigt werden. Ich schätzmal das bei read_file2float() ein Bug drin ist.

    Kann mir diesbetzüglich jemand vielleicht noch helfen? 🙄

    const char path[] = "C:\\bla\\float.txt";
    
    union trans
    {
        float f;
        char c[sizeof(float)+1];   //:D 
    };
    
    void write_float2file(trans *t) 
    { 
        fstream datei; 
        datei.open(path, ios::out | ios::app);       //Zum schreiben oeffnen, anhaengen 
    
        if(!datei) 
            cout << "Datei kann nicht geoeffnet werden!" << endl; 
        else 
        { 
            datei << t->c;  
        } 
    
        datei.close(); 
    } 
    
    void read_file2float() 
    { 
        fstream datei; 
        datei.open(path, ios::in);                  //Zum lesen oeffnen 
        trans temp; 
    
        int i = 0; 
    
        if(!datei) 
            cout << "Datei kann nicht geoeffnet werden!" << endl; 
        else 
        { 
            while(datei.get(temp.c, sizeof(float)+8))
            { 
                cout << temp.f << endl; 
            }
        } 
    
        datei.close(); 
    
    } 
    
    int main()
    {
        fstream datei;
        datei.open(path, ios::out | ios::trunc);        //Datei Inhalt loeschen
        datei.close();
    
        trans transfer; 
    
        transfer.f = 12345.789; 
    
        cout << "Float unformatiert in Datei abspeichern..." << endl; 
        write_float2file(&transfer, 0); 
    
        transfer.f = 9876.456;  //Ein zweiter Float abspeichern 
        write_float2file(&transfer, 1); 
    
        transfer.f = 147876.5555;  //Ein zweiter Float abspeichern 
        write_float2file(&transfer, 2); 
    
        transfer.f = 5476.4434;  //Ein dritte Float abspeichern 
        write_float2file(&transfer, 2); 
    
        cout << "Float unformatiert aus Datei lesen..." << endl; 
        read_file2float();  //Alle Float in der Datei auslesen
    
        return 0;
    }
    


  • Hab den Fehler nach einer 2 Stündigen Pause gefunden 😃
    Ich muss das File natürlich Binär öffnen.

    Trotzdem, danke für eure Hilfe



  • Und das beste ist, das du dir dann die Mühe mit der Union sparen kannst und einfach

    stream << floatinpoint_objekt;
    

    schreiben kannst.


Anmelden zum Antworten