Float liefert falschen Wert(?)



  • Hallo,

    ich lese Temepraturdaten (Kelvin) und einige Daten die Datei betreffend aus einer Datei aus. Im Header der Datei werden einige Daten im Float Format gespeichert und die Temperaturdaten sind ebenfalls alle vom Float Datentyp.

    Bei den Temperaturdaten bekomme ich nun allerdings ein Problem:
    Einige Daten liest er korrekt aus nur je nach Datei kommt er irgendwann an einen Punkt, wo ich nur noch den Wert -107374176.0000000 auslesen kann.
    Sieht vielleicht irgendwie nach einem "Überlauf" oder so aus? Habe es mit verschiedenen Dateien versucht, die jeweil verschiedene Daten enthalten. Der Fehler tritt an unterschiedlichen Stellen auf, als ob irgendwann mal ein Wert auftritt, den Float nicht verträgt.

    Codelisting meiner Funktion zum auslesen von Float Datensätzen:

    float xxx::readFloat(){
    	float ret = 0;
    	unsigned char buffer[sizeof(float)];
    	fread((char*)&buffer, 1, 4, file);
    	memcpy(&ret, buffer, sizeof(float)); 
    	return ret;
    }
    

    Ich bin für jede Hilfe dankbar...



  • Warum machst du es nicht so? Den buffer brauchst du doch gar nicht. Außerdem hast du den Größen mit dem Anzahl-Parameter vertauscht.

    float xxx::readFloat(){
        float ret = 0;
        fread((char*)&ret, sizeof(ret), 1, file);
        return ret;
    }
    

    Sind die Daten wirklich binär gespeichert?



  • Danke für die schnelle Antwort.

    Gespeichert werden die Dateien von einem Programm. Ich gehe davon aus, dass diese binär gespeichert sind.

    Die Lösung ist natürlich eleganter. Das Problem bleibt allerdings bzw. nun bekomme ich nur 0 Werte. Ich bin mir allerdings sicher, dass die Daten in der Datei richtig gespeichert und != 0 sind.


  • Administrator

    Naja, jetzt gäbe es nur noch anzumerken, dass du C Funktionen statt C++ Funktionen benutzt. Das hat aber sehr wahrscheinlich nichts mit deinem Problem zu tun, es gilt nur als "unschön" 🙂

    Zu deinem Problem, bist du sicher, dass du an der richtigen Byteposition bist? Ein typischer Fehler beim Auslesen von binären Daten ist, dass man plötzlich um ein paar Bytes verrutscht, aus welchem Grund auch immer.

    Hast du auch BE/LE (Endian) richtig beachtet, also sind die im File gleich, wie das System auf welchem du arbeitest?

    Ansonsten, ist es schwer dir da zu helfen. Wenn alle Voraussetzungen richtig erfüllt sind, müsste der Code funktionieren 🙂

    Grüssli



  • *Räusper* Ja das mit den C-Funktionen ist nicht die schönste Lösung, ich hatte aber mal einen ähnlichen Ansatz in C, den ich einfach wiederverwendet habe.

    Die Byteposition ist defintiv richtig, da sich die ersten Werte oftmals auslesen lassen und die einfach alle hintereinander weggeschrieben sind. Deswegen verwirrt mich die ganze Sache auch etwas...



  • So, was ich jetzt noch mal gemacht habe ist, dass ich den File-Pointer X*4 Stellen weiter gesetzt haben, wo sonst immer nur die selben Zahlen kamen. Nun bekomme ich aber wieder richtige Werte und ab einer bestimmten Position dann wieder die selben.

    Es sind 340*240 Werte. Müsste ich ab ner bestimmten Anzahl mal ne "Pause" machen oder so?



  • Die Zahl -107374176f entspricht dem Bitmuster von 4 Bytes mit je dem Wert 0xCC. Das ist im Debug-Modus von Visual-C++ ein Zeichen für eine uninitialisierte Speicherstelle. Ich würde also sagen, der fread-Aufruf ist an der Stelle fehlgeschlagen. Dateiende erreicht und nicht richtig abgefangen?
    (Meine erste Idee wäre gewesen, dass die Datei im Textmodus statt im Binärmodus geöffnet ist, aber das scheint es nicht zu sein.)

    Falls das nicht hilft, mal eine Fehlerbehandlung einfügen:

    // traditionell gehalten ;) hab gerade keine Lust auf Exceptions
    if (fread((char*)&buffer, 4, 1, file) < 1)
    {
      perror("fread");
      exit(EXIT_FAILURE);
    }
    


  • Mh, an der besagten Stelle springt er in die If Bedingung, gibt aber an "fread: No error"



  • Also, ich bin es nun so umgangen, dass ich bei einem Error den Pointer um 4Bytes verschoben habe. Allerdings ist mir da nen bisschen unwohl bei. Könnte das evtl. nen Zeilenumbruch oä. verursacht haben?


  • Administrator

    Bennnno schrieb:

    Könnte das evtl. nen Zeilenumbruch oä. verursachen?

    Zeilenumbuch? Seit wann hat eine binäre Datei einen Zeilenumbruch? Die hat ja noch nicht einmal Zeilen. Bist du sicher, dass du binär gespeicherte Daten hast? 🙂

    Grüssli



  • Hoppla, das ist natürlich Unfug.

    Aber irgendwoher kommt der Fehler beim lesen ja.



  • Da müsste man jetzt das Protokoll welches beim Schreiben der Datei genommen wird kennen. Evtl. werden ja an bestimmten Stellen Steuerzeichen oder Kontrollcodes eingesetzt.



  • Die Beschreibung des Dateiformats gibt leider nur genaue Aufschlüsselung über den Header der Datei. Daten sollen hintereinander in der Datei stehen.

    Ich teste erstmal so weiter und hoffe, dass ich mit meiner Gummiband Lösung auch alle Daten bekomme.

    Vielen Dank erstmal.


Anmelden zum Antworten