Problem beim BMP-File-Lesen mit ifstream



  • Hi!

    Ich hab ein Problem beim Lesen eines BMP-Files. Seltsamerweise klappt es bei den meisten Files problemlos, die Pixelwerte (in RGB) auszulesen, bei einigen Files passiert es aber nach einigen Pixeln, dass nicht mehr die richtigen Werte ausgelesen werden (liegt nicht am BMP-File, ich hab mit einem HexEditor gecheckt, dass das BMP-File korrekt ist), sondern nur noch der Wert 205, der aber nicht den Werten entspricht, die eigentlich an diesen Positionen stehen sollten.

    Ich hab ein kleines Testprogramm geschrieben, wo der Fehler auch auftritt. Ich werd versuchen, das BMP-File dazu irgendwo hochzuladen (bei meiner FH scheint leider im Moment der Server unten zu sein 😞 ), vielleicht hat aber jemand sowas auch schonmal erlebt und kann mir so sagen, wo das Problem liegt. Das BMP-File besteht aus 4x4 Pixeln, RGB, d.h. die Daten sind 48Byte groß (4x4x3), bis zum 17. Byte liest es korrekt, danach kommt wie gesagt nur noch 205.

    Hier der Code des Testprogramms:

    #include<iostream>
    #include<fstream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    	ifstream *file = new ifstream("ut2003.bmp");
    
    	file->seekg(54, ios::beg);	// jump to bmp data, starts at byte 54
    
    	char *buffer = new char[48];
    	file->read(buffer, 48);
    	for(int i=0; i<48; i++)
    		printf("data byte %d = %d\n", i, (unsigned char)buffer[i]);
    
    	file->close();
    	return 0;
    }
    

    Hat jemand eine Idee, woran das liegen könnte? Ich hab echt keine Ahnung, warum dieser Fehler auftritt. Wär echt super, wenn ihr mir helfen könntet!

    Thx. Nick.



  • Um Binärdaten auszulesen, solltest du die Datei mit ios::binary öffnen, also

    ifstream file("blablub.bmp", ios::binary);
    

    Außerdem hat C++ keinen Garbage Collector. Dein Code leakt Speicher, weil du new verwendest und nicht per delete/delete[] aufräumst. Hier kommst du aber völlig problemlos ohne new aus. Für den ifstream s.o., und für das Array einfach

    char arr[48];
    

    printf ist auch nicht mehr die Höhe der Zeit für solche Aufgaben. Am besten, du liest dir mal die FAQs oder ein gutes (aktuelles) Buch durch...


Anmelden zum Antworten