nächstes Problem! =>id3 Tags<=
-
Wir ihr ja vielleicht wisst bastel ich grad ne verkettete Liste
hatte schon so einige Probleme damit
und hier kommt das nächste:würde gern die id3 Tags von mp3´s auslesen und die Daten
an meine Liste hängen.Hab schon ein bißchen rum probiert aber es liest nur Müll
aus...vielleicht wisst ihr ja warum?Meine DATEN Struktur:
struct DATEN { char tag[3]; char Titel[31]; char Interpret[31]; char Album[31]; char Jahr[4]; char Track[31]; char Genre[31]; char Kommentar[31]; };
und meine Funktion um die id3 Tags auszulesen:
struct DATEN *id3() { struct DATEN *neudaten; neudaten=(struct DATEN*)malloc(sizeof(struct DATEN)); FILE *datei_ptr; char ver[4]; datei_ptr = fopen("test.mp3", "rb"); if ( datei_ptr != 0) { /* Nach ID3v2 Tag suchen*/ fseek(datei_ptr,0,SEEK_SET); fread(ver,3,1,datei_ptr); if (strcmp(ver, "ID3") == 0) { printf("ID3v2 Tag vorhanden!"); } /* Nach ID3v1 Tag suchen */ if (fseek(datei_ptr,-128,SEEK_END) == 0) { fread(neudaten->tag,3,1,datei_ptr); if (strcmp(neudaten->tag, "TAG") == 0) { fread(neudaten->Titel,30,datei_ptr); fread(neudaten->Interpret,30,1,datei_ptr); fread(neudaten->Album,30,1,datei_ptr); fread(neudaten->Jahr,4,1,datei_ptr); fread(neudaten->Kommentar,29,1,datei_ptr); fread(neudaten->Genre, sizeof(unsigned char), 1, datei_ptr); fread(neudaten->Track, sizeof(unsigned char), 1, datei_ptr); neudaten->Titel[30]='\0'; neudaten->Interpret[30]='\0'; neudaten->Album[30]='\0'; neudaten->Jahr[4]='\0'; neudaten->Kommentar[30]='\0'; } } else { printf("Zeiger konnte nicht gesetzt werden!"); fclose(datei_ptr); } } else { printf("Fehler beim öffnen der Datei!"); } return neudaten; }
-
strcmp() erwartet, dass der String mit dem Stringendezeichen abgeschlossen ist, fread() macht aber nicht automatisch das Stringendezeichen hinten dran (wär ja auch schmarrn). Du hast somit 2 Möglichkeiten. Entweder du machst das Stringendezeichen (0 oder '\0') selber hinten dran (also ver[3] = 0) oder du vergleichst mit strncmp(). Diese Funktion vergleicht entweder bis es das Stringendezeichen liest oder bis zu der angegebenen maximalen Anzahl an Zeichen. In deinem Fall wären das 3.