Binärdatei mit unterschiedlichen Datentypen



  • Hi,

    ich muss eine Binärdatei auslesen, die _immer_ wie folgt aufgebaut ist:

    char[4] (magic number)
    unsigned char x
    unsigned char y
    unsigned char[x][y]

    Ich schaffs allerdings nur, die Magic Number auszulesen, und zwar damit:

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    int main()
    { 
        cout << "starting" << endl;
        fstream ConfigFile("map.cfg", ios::in|ios::out|ios::binary);
        cout << "vor if" << endl;
        if (ConfigFile.is_open())
        {
    
            ConfigFile.seekg(0, ios::end);
            unsigned long FileSize = streamoff(ConfigFile.tellg());
            ConfigFile.seekg(0, ios::beg);
            cout << "filesize:" << FileSize << endl;
    
            char* pBuffer = new char[FileSize];
            ConfigFile.read(pBuffer,8);
            cout <<"Puffer" << endl;
    
            for (int i = 0; i<5; i++){
             cout << pBuffer[i];
    
            }
              cout << endl;
    
            delete [] pBuffer;
        } 
    }
    

    (Die paar couts sind zum debuggen)
    Die Ausgabe des Inhalts ( cout << pBuffer[i];) funktioniert bei der Magic number (also den ersten 4 zeichen), aber dann wird nichts mehr ausgegeben, obwohl zumindest die zwei zeichen nach der Magic Number noch einfache Zahlenwerte sein sollten.

    Ich gehe mal davon aus, dass es an den unsigned chars liegt, aber warum interpretiert mein Programm die bei der Ausgabe nicht? Die Bitgröße ist dieselbe wie bei signed chars (also den ersten 4 zeichen)...

    Weiß jemand rat?

    lg



  • Zunächst einmal liest du 8 Zeichen

    ConfigFile.read(pBuffer,8);
    

    gibst in der Schleife allerdings nur 5 Zeichen aus

    for (int i = 0; i<5; i++)
    

    8 Zeichen reichen übrigens nicht aus, wenn du Zeilenumbrüche zusätzlich in
    deiner Datei hast.



  • Ach, das hab ich übersehn..

    Die Werte stehn in der Binärdatei direkt nebeneinander, ohne irgendein Trennzeichen.

    Ich habe die Zahlen jetzt geändert, ich lese "FileSize" zeichen ein und gebe "FileSize" zeichen aus. Allerdings stimmen die Werte nach der Magic number immer noch nicht.



  • na lies halt erst 4 dann eines und nochmal ein byte aus. wo ist das problem?



  • Die Werte werden schon stimmen, allerdings ist pBuffer ja char*. D.h. cout versucht das als string zu interpretieren und bricht dann natürlich die Ausgabe bei der ersten 0 (Terminierung) ab.
    Caste den Puffer bei der Ausgabe nach void* und du solltest alles sehen.


Anmelden zum Antworten