FP32 Datei einlesen



  • Hallo,

    ich habe eine Datei, in der binär eine N X N Höhenkarte binär als 32bit Floatingpointstream abgespeichert ist. Das 1. Float ist also die 1. Höhe der N x N Karte, das 2. Float die 2. Höhe usw.
    Ich will nun die gesamte Datei einlesen und hab das so probiert:

    FLOAT*	heightData;
    std::ifstream heightmapStream(str.c_str(), std::ios::binary);
    heightmapStream.seekg(0, std::ios::end); 
    UINT vertexCount = heightmapStream.tellg(); 
    vertexCount /= 4;
    heightmapStream.seekg(0, std::ios::beg);
    
    // Load height data
    heightData = new FLOAT[vertexCount]; 
    heightmapStream.read( (char*)heightData, vertexCount*4); 
    heightmapStream.close();
    

    Ich öffne also die Datei, speichere in vertexCount die Anzahl Bytes, teile das durch 4 (weil jeder Float aus 4 Bytes) besteht und lese am Ende mit read() die ganze Datei in das float array.
    Aber genau da liegt der Hund begraben: Mein Programm hat ganz komische Anomalien und ich bin mir nicht sicher, ob dieses read da einfach so funktioniert (ob ich also einfach die Datei als char* stream einlesen kann und das dann am ende ein gültiges float array ist).

    Mach ich das richtig und falls nein: wie ginge es richtig?



  • du musst erst atof verwenden, da du Ascii einliest und nicht float.

    mfg liggi1998



  • atof? Ist das nicht C? Und wieso les ich die Datei als ASCII ein, wenn ich sie binär öffne? 😕



  • Weiß niemand wie das in C++ geht?



  • Der Code sieht gut aus, deine "ganz komischen Anomalien" werden wohl an anderer Stelle verursacht.



  • an deiner Stelle würde ich es mal versuchen,
    die 4 nicht konstant in den Quellcode zu schreiben.
    Ersetz sie lieber mal durch sizeof(float) und guck mal, was da rauskommt.

    Ich bin mir zwar nicht ganz sicher, aber ich meine mal gelsesen zu haben,
    dass ein float bereits 64 Bit hat...

    /EDIT: sry, hab das gerade überprüft, also ignorier das eben einfach 😉
    ein float hat doch nur 4 Bytes



  • FLOAT*    heightData;
    std::ifstream heightmapStream(str.c_str(), std::ios::binary);
    heightmapStream.seekg(0, std::ios::end);
    UINT vertexCount = heightmapStream.tellg();
    vertexCount /= 4;
    heightmapStream.seekg(0, std::ios::beg);
    
    // Load height data
    heightData = new FLOAT[vertexCount];
    heightmapStream.read( (char*)heightData, vertexCount*4);
    heightmapStream.close();
    

    hmpf ... naja 😉

    std::ifstream file_stream(string.c_str(), std::ios_base::binary);
    if (!file_stream) throw std::invalid_argument("filename invalid");
    
    file_stream.seekg(0, std::ios_base::end);
    
    std::vector<float> heightmap(file_stream.tellg() / sizeof(float));
    file_stream.read(reinterpret_cast<char*>(&heightmap[0]), sizeof(float) * heightmap.size());
    

    hmm ...

    std::ifstream file_stream(string.c_str(), std::ios_base::binary);
    if (!file_stream) throw std::invalid_argument("filename invalid");
    
    std::vector<float> heightmap(std::istream_iterator<float>(file_stream), std::istream_iterator<float>());
    

    ist aber mein favourit !;)



  • Was genau meinst du mit "hmpf naja"?
    Dein 2. Code ist doch exakt dasselbe, nur dass du statt einem float array einen vector benutzt, oder?

    Könnte es eigentlich ein Problem sein, dass die Floats in der Datei ein anderes Binärformat haben als es C++ benutzt? 😕


Anmelden zum Antworten