[Erledigt] Binär-Datei einlesen



  • Hallo zusammen,

    Ich habe in meiner Arbeit ein umfangreicheres Programm in Matlab geschrieben.
    Heute würde ich gerne einzelne Teile aus Interesse in C umschreiben.
    Ich scheiter jedoch beim Einlesen meiner Messdaten.
    Sie werden von unserem Messprogramm als float32, big endian und Binär gespeichert.
    In der Regel sind dass zwischen 10.000 und 1.000.000 Werte.
    Das Einlesen der Daten aus dieser Datei klappt überhaupt nicht. Nur wenn ich per C eine Datei schreibe mit Float Werten kann ich diese wieder einlesen.

    int main(void)
    {
        FILE *Datei;
        int *wert[4]; //float *wert[4]; fuehrt ebenfalls zu keinem Ergebnis
        //Oeffne die Datei im Binaeren-Lese Modus
        Datei = fopen("Signal.bin","rb");
        if(Datei == NULL)
        {
            printf("Die Datei konnte nicht geoeffnet werden");
        }
        else
        {
            //Springe an den Dateianfang
            rewind(Datei);
            //Lese einen Wert mit der groesse von 4 Byte aus.
            fread(wert,sizeof(wert),1,Datei);
            printf("Der Wert ist: %f\n",*wert);
            //function_swap( wert );
        }
        fclose(Datei);
        return 0;
    }
    

    Unter Windows werde ich wohl noch ein Byteswapping machen müssen. Jedoch würde ich gerne als Erfolg feiern, die Datei richtig einzulesen, bzw. erst mal nur einen Wert richtig einzulesen.
    Übriegens, ist das Messsignal hier ein referenzsignal und spiegelt eine Sinuswelle wieder.

    Ich hoffe Ihr könnt mich etwas leiten, dass ich mir das erarbeiten kann.
    Viele Grüße



  • Wenn du float lesen willst, musst du auch irgendwo eine float-Variable definieren.
    Du hast int *[4] definiert, das hat mit float nicht sehr viel zu tun.
    fclose(Datei) steht falsch, gehört mit in den Leseblock.
    Kommentare schreibt man üblicherweise über den Code, nicht darunter.



  • Das ist natürlich korrekt, dass es dann ein float sein sollte.
    Ich habe bisher mehrere Ansätze ausprobiert.
    Es funktioniert leider auch mit einem float nicht.



  • Schreibe erstmal einen Test, der einen float in eine (Binär)Datei schreibt und korrekt wieder liest.
    Erst wenn das funktioniert kannst du dich um die Byteorder der Matlab-floats kümmern.



  • Skywalker077 schrieb:

    Hallo zusammen,
    Nur wenn ich per C eine Datei schreibe mit Float Werten kann ich diese wieder

    Habe ich bereits getan. Das klappt mit diesem Code wunderbar.



  • Rede nicht lange rum, sondern zeige den Code, der angeblich nicht läuft, und nicht den Code, der läuft.



  • Okay,
    zuerst das zum schreiben:

    int main(void)
    {
        FILE *Datei;
        float wert;
        float i;
        Datei = fopen("Signal.txt","wb");
        if(Datei == NULL)
        {
            printf("Die Datei konnte nicht geoeffnet werden");
        }
        else
        {
            //Es soll ein Wert in die Datei geschrieben werden.
            i = 5.5;
            wert = &i;
            printf("Dieser Wert wird jetzt geschrieben: %f",*wert);
            fwrite(wert,sizeof(wert),1,Datei);
            fclose(Datei);
        }
        return 0;
    }
    

    gelesen wird hiermit:

    int main(void)
    {
        FILE *Datei;
        float wert;
        int k;
        Datei = fopen("Signal.txt","rb");
        if(Datei == NULL)
        {
            printf("Die Datei konnte nicht geoeffnet werden");
        }
        else
        {
            //Es soll gelesen werden
            k = fread(&wert,sizeof(wert),1,Datei);
            printf("Es wurden %d Bytes gelesen\n",k);
            printf("Das steht in der Datei: %f",wert);
            fclose(Datei);
        }
        return 0;
    }
    

    Das Schreiben und Einlesen funktioniert bei diesen Schnipseln.
    Ich schaffe es jedoch nicht, den einlese Code zu benutzen fuer mein Problem mit meine Messdaten.



  • Deine Schreib-Funktion ist Müll, da wird alles Mögliche in die Datei geschrieben, aber nicht ein float. Schaue dir die Compilerwarnungen an.



  • Ich kann dir leider nicht folgen.
    Codeblock mit MinGW Compiler bei folgenden Flags:
    -ansi
    -Wall
    -pedantic

    gibt bei dem Code keinen Fehler/Warnung aus.

    Der Einlese Teil funktioniert. Er liest die Zahl(en) ein, die ich vorher schreibe.



  • Trotzdem ist das Müll.

    float wert;
        float i;
    ....
        i = 5.5;
        wert = &i;  // was soll das sein? Du weist einer float-Variablen eine Adresse zu
    
    i = 5.5;
            wert = i;  // oder gleich 5.5
            printf("Dieser Wert wird jetzt geschrieben: %f", wert);
            fwrite(&wert,sizeof(wert),1,Datei);
    


  • Aber mal zu deinem ersten Post.

    Mit

    float wert[4]; // keine Zeiger
    

    in Zeile 4 und

    fread(wert,sizeof(wert[0]),4,Datei);
    

    in Zeile 16, werden auch 4 Werte eingelesen (so sie denn in der Datei sind).



  • Das mit dem Zeiger war mein Fehler. Danke
    Ich denke jetzt habe ich die Werte im Little Endian Format.
    Sie werden leider im Big Endian gespeichert.

    E: ERLEDIGT!
    Danke


Anmelden zum Antworten