Letzten 128 Byte auslesen einer Datei
-
Ich versuche ein Programm, welches die ID-Tags von MP3-Dateien ausliest, zu programmieren. Die Tags sind in den letzten 128 Byte enthalten. Nur weiß ich nicht genau wie man das mit fstreams lösen sollte. Ich hab es mal so gemacht:
struct Lied { std::string Interpret; std::string Titel; std::string Album; unsigned int TitelNummer; };std::ifstream mp3Datei("bla.mp3",std::ios::binary); if(!mp3Datei) { std::cout << "Datei nicht gefunden!" << i->c_str()<< std::endl; // abbrechen } int Groesse = 0; while(mp3Datei.ignore()) { Groesse++; } mp3Datei.clear(); mp3Datei.seekg(Groesse - 126); Lied AktLied; char temp[30]; mp3Datei.read(temp,sizeof(temp)); AktLied.Titel = temp; mp3Datei.read(temp,sizeof(temp)); AktLied.Interpret = temp; mp3Datei.read(temp,sizeof(temp)); AktLied.Album = temp; mp3Datei.ignore(34); // Ignoriere Erscheinungsjahr und Notiz mp3Datei.read(reinterpret_cast<char*>(&AktLied.TitelNummer),sizeof(AktLied.TitelNummer));Das funktioniert auch (bis auf die Titelnummer), ist aber TOTAL langsam!! Für eine Datei braucht er mehrere Sekunden und für eine ganzes Album ne halbe Minute! Ich hab wahrscheinlich auch den uneffektivsten Weg gewählt, mir ist aber keine Alternative eingefallen. Wie lässt sich dies lösen??
mfg.
-
mp3Datei.seekg( 0, ios::end ); size_t length = mp3Datei.tellg();Lesen kannst du die letzten 128Bytes mit
unsigned char buf[128]; mp3Datei.seekg( -128, ios::end ); mp3Datei.read( buf, 128 );
-
Danke! Das mit dem end kannte ich noch nicht! So sieht's jetzt aus:
struct Lied { std::string Interpret; std::string Titel; std::string Album; unsigned char TitelNummer; };std::ifstream mp3Datei("bla.mp3",std::ios::binary); if(!mp3Datei) { std::cout << "Datei nicht gefunden!" << std::endl; // abbrechen } mp3Datei.seekg(-125, std::ios::end); Lied AktLied; char temp[30]; mp3Datei.read(temp,sizeof(temp)); AktLied.Titel = temp; mp3Datei.read(temp,sizeof(temp)); AktLied.Interpret = temp; mp3Datei.read(temp,sizeof(temp)); AktLied.Album = temp; mp3Datei.ignore(33); // Ignoriere Erscheinungsjahr und Notiz mp3Datei.read(reinterpret_cast<char*>(&AktLied.TitelNummer),sizeof(AktLied.TitelNummer)); Lieder.push_back(AktLied);mfg.