Reading doubles from binary .dat file



  • Hey guys.

    I have a problem reading some doubles from a binary .dat file.
    I first started reading only 1 double from that file, but it doesn't work.
    It's not storing the data into the variable.

    std::ifstream file;
    	file.open("datafile.dat");
    
    	if(file.fail())
    		return -1;
    
    	double data = 1.0;
    
    	if( file.good() )
    		file >> data;
    
    	std::cout << data;
    	file.close();
    

    file >> data don't fails but also doesn't writes anything in data.
    I googled that but can't find any solution for that.

    If I have forgotten something to tell you about that please fell free to ask.

    Thanks
    Thrasher



  • Hab gerade gesehen, dass in diesem Forum ja größtenteils deutsch geschrieben wird.

    Also Entschuldigung für das schlechte Englisch und ihr könnt auch gerne auf deutsch antworten 😃



  • operator>>() ist nicht für binäres Lesen gedacht.
    Womöglich suchst Du read().
    Und Du solltest die Datei auch binär öffnen( file.open("datafile.dat", ios_base::binary) ).

    Edit:

    Wenn Du binär direkt z.B. in eine double einlesen willst, mußt Du sicher sein, daß die Daten in der Datei auch im richtigen Format(u.A. Byteorder beachten!) vorliegen, sonst liest Du Datensalat.



  • Ich verstehe noch nicht ganz, wie ich read() da nutzen soll.
    Das gibt mit doch einen character zurück und ich brauche aber double.



  • Probier mal (ungetestet):

    std::vector<double> vd(100);
    file.read((char*)vd.data(), vd.size() * sizeof(double));
    

    Solltest natuerlich wissen, wieviele Doubles in der Datei stehen. Wahlweise kannst du auch mittels gcount() ueberpruefen, wievele Daten gelesen wurden.



  • Alles beteht nur aus Bytes( char ). Ob double , int , ... ist Sache der Interpretation.

    double d;
    file.read((char*)&d, sizeof(d));
    

    Aber wie gesagt: Du mußt sicher sein, daß das was Du liest exakt der Repräsentation von double auf deiner Maschine entspricht, oder Du mußt umkodieren.

    ~Ja, ja. böser C-Cast. In solchen Fällen sehe ich aber keinen Nachteil.~



  • Leider liest er mir bei allen Varianten nur -1.#IND000000 ein.

    Liegt das dann an dem File?



  • Da wir weder deinen Code noch deine Datei kennen, ist diese Frage schwer zu beantworten.



  • Also das File hat die Daten mit little endian gespeichert.
    Da stehen einfach Messwerte drinnen, die von woanders herkommen.

    std::ifstream file;
    	file.open("file.dat", std::ios_base::binary);
    
    	if(file.fail())
    		return -1;
    
    	std::vector<double> data(10);
    	if( file.good() )
    		file.read( (char*)data.data(), data.size() * sizeof(double) );
    	file.close();
    


  • Der Code sieht erstmal richtig aus.
    Kannst Du irgendwie die Daten zeigen?



  • Hmm....weiß jetzt nich, wie ich das am besten öffnen kann...



  • Habs mal mit nem HEX-Editor geöffnet.
    Weiß nich, ob ihr damit was anfangen könnt. Ist auch nur ein Auszug, weil die Datei sehr viele Messwerte enthält.

    `

    00000000 0000F8FF 00000000 0000F8FF

    00806C9C A2374E3F 00000000 0000F8FF

    0000FA0C EA974C3F 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    0080AE11 044E4A3F 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF

    00000000 0000F8FF 00000000 0000F8FF`

    Die Formatierung ist in der Datei natürlich nicht vorhanden.
    Hab ich jetzt nur mal wegen der Übersicht reingemacht.



  • Die ersten 32 doubles:

    -1.#QNAN00000000000 -1.#QNAN00000000000 0.00092215957633712611
    -1.#QNAN00000000000 0.00087260177856851931 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    -1.#QNAN00000000000 -1.#QNAN00000000000 -1.#QNAN00000000000
    0.00080275725064282710 -1.#IND000000000000

    Sieht richtig aus...



  • Was bedeutet denn das 1.#QUNAN?



  • NaN



  • Das hatte ich soweit schon nachgeschaut.
    Die Frage war eher, was das nun bedeutet. Kann denn sowas rauskommen, wenn man die Datei richtig einliest?


  • Mod

    Thrasher schrieb:

    Das hatte ich soweit schon nachgeschaut.
    Die Frage war eher, was das nun bedeutet. Kann denn sowas rauskommen, wenn man die Datei richtig einliest?

    Das ist sogar zu hoffen, dass das rauskommt und ein eindeutiges Zeichen, dass man es richtig gemacht hat, denn schließlich hast du ja in deinem Hexeditor gesehen, dass genau dies in der Datei steht.

    Die Frage ist wohl eher: Soll das wirklich in der Datei stehen? Bist du dir sicher, dass es die richtige Stelle der richtigen Datei ist? Stimmt das Format?



  • Die Endianess sollte doch aber hinhauen...little endian is das File und auf Windows sollte das doch auch so sein.

    Wenn ich die Hex-Werte zum Beispiel bei http://gregstoll.dyndns.org/~gregstoll/floattohex/ umrechnen lasse, dann gibt der immer korrekte Zahlen aus.



  • Und da kommt dann immer 3.14932264629e-319 raus. Wundert dich das nicht?
    Die Seite liest big endian.


Anmelden zum Antworten