Daten elegant auslesen
-
Aktuell schreibe ich ein Programm, dass bestimmte Daten aus einer Datei auslesen soll. Das Auslesen ist kein Problem und zum aktuellen Zeitpunkt habe ich die ausgelesenen Daten alle in einem std::string.
Nun müssen die Informationen ausgelesen werden. Dabei ist angegeben, nach wieviel Bytes die nächste Information kommt bzw. wie lang die Information maximal sein darf.
Momentan schaut der (relevante) Code so aus:
std::vector<char> buffer(extended_header::total_size + standard_header::total_size); s.read(&buffer[0], buffer.size()); std::string data(buffer.begin(), buffer.end()); if (data.compare(extended_header::total_size, 3, "TAG") == 0) { int offset = extended_header::total_size + standard_header::header; info.title = data.substr(offset, standard_header::title); offset += standard_header::title; info.artist = data.substr(offset, standard_header::artist); offset += standard_header::artist; info.album = data.substr(offset, standard_header::album); offset += standard_header::album; info.year = data.substr(offset, standard_header::year); offset += standard_header::year; }Weiß jmd. eine bessere Methode (z.B. Operatorenüberladung?) um die Daten so zu lesen? Das momentan nach jedem Schritt das Offset neu berechnet werden muss stört mich.
-
wenn Du von 'Lesen' sprichst, neudeutsch: Input, so bieten sich die Möglichkeiten der Input/Output-Library an. Dann hast Du auch keine nervige offset-Variable mehr.
Wie sieht denn das Datei-Format aus? Poste doch mal ein paar Zeilen aus der Datei.
-
Eine lokale Funktion ist eine von vielen Möglichkeiten:
auto read_fixed_string=[&](size_t length) -> std::string { auto str = data.substr(offset, length); offset += length; return str; }; info.title = read_fixed_string(standard_header::title); info.artist = read_fixed_string(standard_header::artist); info.album = read_fixed_string(standard_header::album); info.year = read_fixed_string(standard_header::year);Und da
standard_header::titleusw. ja offenbar Längenangaben sind, sollte das auch der Name wiederspiegeln.
Wenn ich das so lese, wundere ich mich erst einmal, warum die komische Funktion einen Titel bekommt und auch wieder einen zurückgibt.
-
Es handelt sich konkret um ID3-Tags, in der Version 1 sind die Daten (Albumname, Künstler etc.) am Ende der .mp3-Datei gespeichert. Man lies also bis zum Ende der Datei, geht eine entsprechende Anzahl Bytes zurück (z.B. 128) und ließt dann diese wobei die ersten 30 Bytes der Albumname sind usw.
-
Das betrifft also das Auslesen einer Binärdatei, in der auch Texte stehen können.
Wenn Du's 'elegant' haben möchtest, so würde ich Dir so etwas empfehlen, was ich schon mal dazu geschrieben habe. Ist aber einiges an Arbeit, aber Du hast dann ein Werkzeug wo auch die komplizierten Formate von ID3.v2 und jünger zu meistern wären.
Wenn Du es einfach haben willst, so mache das, was Athar vorgeschlagen hat.
Noch eine Detailfrage: mit was für Zeichen sind die Strings hinten aufgefüllt? es ist ja nicht jeder Name genau 30 Zeichen lang.
Gruß
Werner