fread und co
-
hi
schreibe für lernzwecke gerade an einer klasse die einen mp3 tag ausliest. leider scheitere ich an fread und co. was mache ich falsch?
bool MP3Tag::ReadID3Tag(char *filename) { mp3Filename = filename; if(PathFileExists(mp3Filename)) { char buffer[128]; FILE *file = fopen(mp3Filename, "r"); fseek(file, 0L, SEEK_END); fread(buffer, 128, 1, file); fclose(file); if(buffer[0] == 'T' && buffer[1] == 'A' && buffer[2] == 'G') { return true; } } return false; }mein ziel ist es die letzten 128 bytes des file stream in ein char array zu übergeben (buffer).
-
fread(buffer, 128, 1, file);Du übergibst die falschen Parameter.
int fread (void * buffer, size_t size, size_t count, FILE * stream);Das heißt wenn du die ersten 128 Bytes (Chars) einlesen willst musst du die Funktion wie folgt aufrufen:
fread(buffer, sizeof(char), 128, file);
-
hm das klappt aber auch nicht.

-
fseek(file, -128L, SEEK_END); fread(buffer, sizeof(char), 128, file);Der Computer beginnt mit fseek(file, 0L, SEEK_END) direkt HINTER der Datei zu lesen. (Ich wüsste nicht mal, ob das ginge, aber auf jeden Fall ist das nicht das, was du willst.)
-
goppe schrieb:
hm das klappt aber auch nicht.

Das liegt daran, dass du die Funktion fseek falsch benutzt. Infos bzg. fseek(): siehe hier.
Zugeschnitten auf dein Beispiel muss fseek so aussehen:
fseek(file, -128L, SEEK_END);Gruß Caipi
-
Naja, du solltest vielleicht den Filepointer nicht ganz bis ans Ende der Datei bewegen. Denn nach dem Ende folgt logischer Weise nichts mehr...
-
fseek(file, 0L, SEEK_END); <- wenn du ganz bis zum ende gehst, wo willst du dann noch weiter lesen?

-
Der Computer beginnt mit fseek(file, 0L, SEEK_END) direkt HINTER der Datei zu lesen. (Ich wüsste nicht mal, ob das ginge, aber auf jeden Fall ist das nicht das, was du willst.)
Jep. Das geht (mit anschließendem schreiben). Allerdings erzeugt ein Positionieren hinter dem Dateiende eine Lücke mit undefiniertem Inhalt.
Gruß Caipi
-
danke :xmas1:
-
Ist ja geil, gleich 4 gleichzeitige gleiche Antworten.
