wie benutzt man ifstream?



  • Ich habe eine Datei an der an erster Stelle ein signed short int gespeichert ist - wie kann ich diesen signed short int auslesen?

    ich hab es so versucht:

    std::ifstream File(Filename.c_str(), std::ios::binary);
    
    short int x = 0xFFFF;
    File>>x;
    

    in x steht aber nachher wieder 0xFFFF und in der Datei steht 0x1000 - was mache ich falsch?

    meine Hacklösung (die ich schon öfter eingesetzt habe 😉 sieht so aus:

    ifstream File(Filename.c_str(), ios::binary);
    
    if(!File) // konnte Datei geoeffnet werden?
    {
    	throw FileNotFoundException(Filename);
    }
    
    File.seekg(0, ios::end);
    long fileSize = File.tellg();
    File.seekg(0, ios::beg);
    
    char *pBuffer = new char[fileSize];
    File.read(pBuffer, fileSize);
    File.close();
    
    const char  * ptr = pBuffer;
    
    short int x = *(*short)ptr;
    

    Das kanns aber wohl nicht sein....



  • Aeh...

    File.read(reinterpret_cast<char*>(&x), sizeof(short));
    

    Sowas?



  • Ist schon recht nah dran.

    std::ifstream File(Filename.c_str(), std::ios::binary);
    
    short int x = 0xFFFF;
    File.read(reinterpret_cast<char*>(&x), sizeof(x));
    


  • Klassisches Missverständnis des Binary-Flags 😉 Das bewirkt nicht, dass Daten binär gelesen oder geschrieben werden, sondern umgeht nur das Code Conversion Facet.

    Unter Windows würde dann z.B. nicht mehr automatisch ein '\n' in #13#10 umgewandelt werden beim Schreiben und genauso andersrum beim Lesen. Unformatted IO mit read ist genau die Lösung.



  • Unformatted IO mit read

    und wie geht das?



  • Vertexwahn schrieb:

    Unformatted IO mit read

    und wie geht das?

    steht schon 2 mal hier im thread.



  • oh... also wenn ich mir read etwas lese, dann ist das immer Unformatted IO? ich dachte ich muss dem read irgendwelche Flags mitgeben, die im sagen das es Unformatted sein soll - dann kann ich mir ja das Flag std::ios::binary sparren, weil das keine Auswirkung auf read hat oder?



  • Kannst du nicht - denn read liest aus der internen Repräsentation des Streambuffers unformatiert. Der Streambuffer wandelt aber erst die externe Repräsentation der Datei in die Interne um - und zwar mit oder ohne Code Conversion Facet, je nach Einstellung des binary-Flags.



  • danke 😉


Log in to reply