Probleme beim Einlesen von ID3-Tag Version 1
-
Hallo Leute,
ich studiere Mechatronik und bin nun im Zuge einer Informatikvorlesung damit beschäftigt eine ID3-Tag-Verwaltung zu programmieren. Da meine Vorkenntnisse gegen Null gehen, wollte ich euch um Hilfe bitten. Ich habe bereits Probleme beim Einlesen einer MP3. Kann mir vielleicht jemand sagen, wo mein Fehler im folgenden Code ist?
# include <stdio.h> # include <conio.h> # include <stdlib.h> # define MAX 10 int i=0; int *h=&i;//*h stellt einen Zeiger dar, mit dem zu jeder Zeit auf den aktuellen Wert von i zugegriffen werden kann. typedef struct ID3_Tag { char songtitel[30]; char interpret[30]; char album[30]; char erscheinungsjahr[4]; } id3tag; //Einlesen eines neuen MP3-Datensatzes mittels auswahl einer MP3 int einlesen(const char* Filename, id3tag *ID3) { char buffer[128]; int x,a; FILE *mp3 = fopen(Filename,"rb"); fseek(mp3,-128,SEEK_END); fread(buffer,1,128,mp3); for(x=0;x<30;x++) ID3->songtitel[x] = buffer[x+3]; //take 3 off cause of TAG ID3->songtitel[30] = '\0'; for(x=0;x<30;x++) ID3->interpret[x] = buffer[x+33]; //33 = TAG + title ID3->interpret[30] = '\0'; for(x=0;x<30;x++) ID3->album[x] = buffer[x+63]; //TAG + title + artist ID3->album[30] = '\0'; for(x=0;x<4;x++) ID3->erscheinungsjahr[x] = buffer[x+93]; //TAG + title + artist + album ID3->erscheinungsjahr[4] = '\0'; for(i = 0; i < x; i++)//alle Register durchlaufen und wenn TAG vorhanden ist drucken { printf( "\n Eintrag: %i" "\n Titel: %s" "\n Interpret: %s" "\n Album: %s" "\n Erschienen: %s\n\n",i , ID3[i].songtitel, ID3[i].interpret, ID3[i].album,/* gen,*/ ID3[i].erscheinungsjahr);//Daten werden ausgegeben } getch(); return 0; } //Hauptfunktion int main(void) { char auswahl; const char Filename = 0; id3tag ID3; //Menü do{ system("cls"); printf("------------ Hauptmenue ------------\n\n"); printf("Waehlen Sie die Funktion aus\n\n"); printf("a -> Daten eingeben\n"); printf("\nx -> Ende des Programms\n"); auswahl = _getch(); switch(auswahl){ case 'a' : system("CLS"); printf("Geben Sie den Dateinamen der einzulesenden MP3 Datei an(mit .mp3):\n\n"); scanf("%s",&Filename); einlesen(&Filename,&ID3); break; case 'x' : system("CLS"); break; default : system("CLS"); printf("Eingabe nicht bekannt, versuchen Sie es erneut.\n"); getch(); break; } }while(auswahl != 'x'); return(0); }
Vielen Dank!
-
Mage7 schrieb:
Kann mir vielleicht jemand sagen, wo mein Fehler im folgenden Code ist?
Das kann der Compiler am besten.
Schalte den Warnlevel auf Maximum und beachte die Warnungen.
Behebe den Grund für diese Warnungen.char album[30]; // Erstellt ein Array mit 30 Elementen deren Index von 0 bis 29 geht. ... album[30] = '\0'; // hier greifst du auf das 31. Elemnt zu, das gar nicht existiert.
const char Filename = 0; // Paltz für ein Zeichen, das du noch nicht einmal verändern willst. scanf("%s",&Filename); // hier willst du einen ganzen Dateinamen in einem Zeichen ablegen, das du nicht verändern willst.
Mach das globale i und h weg.
Und schau dir mal die Standardfunktion memcpy an.
Ach ja, nimm beim nächsten mal bitte Code-Tags für deinen Code.
Code markieren un auf den C-Button unter demclicken.
Kannst du als registriertes Mitglied auch noch nachträglich ändern.
-
Vielen Dank für die schnelle Antwort! Und Entschuldigung für die fehlenden Code-Tags, kannte ich bis jetzt noch nicht.
Ich habe nun das globale i und h gelöscht.
In dem Array habe ich die Bereiche um 1 erhöht, sodass diese nun von 0 bis 30 gehen.
Aus dem const char habe ich ein char gemacht und dieses nicht mehr gleich 0 gesetzt.So funktioniert es aber immer noch nicht wie gedacht.
Läuft das über memcpy besser als mit den Zuweisungen?
Gruß
-
Mage7 schrieb:
Aus dem const char habe ich ein char gemacht und dieses nicht mehr gleich 0 gesetzt.
So funktioniert es aber immer noch nicht wie gedacht.
DirkB schrieb:
const char Filename = 0; // Platz für ein Zeichen, das du noch nicht einmal verändern willst.
scanf("%s",&Filename); // hier willst du einen ganzen Dateinamen in einem Zeichen ablegen, das du nicht verändern willst.Warum behandelst du den Filenamen anders als den songtitel, obwohl sie doch eigentlich gleich sind?
Mage7 schrieb:
Läuft das über memcpy besser als mit den Zuweisungen?
Warum selber machen, wenn es (optimierte) Funktionen dafür gibt
Achte im Augenblick darauf, dass dein Dateinamen keine Leerzeichen enthält.
Das %s von scanf hört bei Leerzeichen mit dem einlesen auf.
-
Ok stimmt. Hatte die Geschichte mit dem const char aus einem andere Forum.
Nun läuft es.
Danke
-
Mage7 schrieb:
Nun läuft es.
Das bezweifle ich.
Zumindestens nicht mit dem gezeigten Code:for(i = 0; i < x; i++)//alle Register durchlaufen und wenn TAG vorhanden ... id3tag ID3;
Du definierst nur ein Element, durchläufst in der Funktion aber ein Array mit 5 Elementen.
-
Wutz schrieb:
for(i = 0; i < x; i++)//alle Register durchlaufen und wenn TAG vorhanden ... id3tag ID3;
Du definierst nur ein Element, durchläufst in der Funktion aber ein Array mit 5 Elementen.
Ja, das war nur ein kleiner Teil vom Gesamtprogramm. Es ist richtig, das er mir zu viele Elemente anzeigen will, aber das war in dem Moment nicht mein Hauptproblem. Ich muss die Elemnte später verändern, löschen und speichern können. Ach ja nach einem bestimmten Element suchen natürlich auch. Damit schlage ich mich jetzt rum, nur so lange ich keine mp3 einlesen kann, bringt es mir im ersten Moment nichts, mich um die anderen Sachen zu kümmern.
Trotzdem Danke für den Hinweis