Datei nach Wort durchsuchen
-
ja okay, thx erstma für die Hilfe, aber das ist eigentlich nicht der Sinn des ganzen. Nehmen wir an ich such nicht "TAG" sondern, "OMG" , was mach ich dann ? Also es geht mir halt ums Prinzip, und das ich nicht verstehe warum er aus der nicht-von-mir-erstellten mp3 Datei keinen "TAG" findet. Wenn ich die .mp3 Datei im Editor öffne, finde ich ganz am Ende genau diese Zeichenkette "TAG", aber das Programm sagt : NÖ ! Warum ???
-
sorry, das war zu hastig, hätte mal weiter lesen sollen:
Mit einer Wahrscheinlichkeit von 1:224 ≈ 0,000006 % beginnt ein normaler Datenblock in einem MP3-Datenstrom mit den drei Bytes "TAG" und würde somit fälschlich als ID3v1-Block identifiziert. Eine mehr oder weniger sichere Lösung für dieses Identifikationsproblem besteht beispielsweise darin, die MP3 Datei nicht von vorne zu durchsuchen, sondern vom Dateiende her, indem man 128 Bytes rückwärts springt und dort wieder vorwärtslesend die "TAG" Marke sucht. Eine 100%ige Sicherheit gibt es aber auch hierfür nicht.
musste also doch die datei durchscannen, am besten von hinten an.
-
toxor schrieb:
..und das ich nicht verstehe warum er aus der nicht-von-mir-erstellten mp3 Datei keinen "TAG" findet. Wenn ich die .mp3 Datei im Editor öffne, finde ich ganz am Ende genau diese Zeichenkette "TAG", aber das Programm sagt : NÖ ! Warum ???
Naja, es kann ein TAG in einer Mp3 Datei drinstehen, muss aber nicht.
Wenn also der TAG-Editor einen findet und dein Programm nicht, dann stimmt allerdings etwas mit deinem Programm nicht.
Eine andere Möglichkeit wäre noch, das der Editor standardmässig einen TAG-Eintrag (vorbereitend im Editor) anlegt, auch wenn vorher keiner in der Datei stand.
Wenn man keine Eintragungen im Editor macht, könnte es sein, das er den TAG-Eintrag wieder verwirft. Oder hast du TAG-Infos eingetragen ?
-
Achso, das man eine Mp3 Datei von hinten auslesen sollte, ist interessant, vll. ne Möglichkeit.
Ne, nicht der TAG-Editor findet die Marke, sondern der Text-Editor :).
Kann schon sein das da was mit meinem Programm nicht stimmt, kann sein, die Frage ist was. Vorallem, Textdatein, die ich selbst erstellt habe, und irgendwo dort das Wort "TAG" abspeichere, findet er. Deswegen dachte ich ja , das mein Programm irgendwie nicht mit den ganzen kryptischen Zeichen auskommt.Ich hab mal zum Spass, mein Prog. die .mp3 Datei ausgeben lassen. Auch in der Anzeige dort, kann ich das Wort "TAG" nicht finden, obwohl ich es, ich sage es nochmal, im TextEditor ( von Windows ) finde. Ist doch komisch oder ?
Nein , ich habe keine tag infos angegeben, wie gesagt es geht mir nur darum, das Wort "TAG" in einer .mp3 Datei zu finden, und mir dann angeben lassen, JA gefunden, oder NEIN, nicht gefunden, alles andere ist erstmal Nebensache
-
also du hast da schon ein paar kleine bis krasse klopfer drin.
for(i=1;i<2;i++) // sinnvoll ? wie oft wird sie durchlaufen ?
while(fgets(Buffer,numChars,dat)) // sinnvoll ? wie oft möchtest du die datei komplett in den puffer schreiben ?probiers doch mal so:
lies von dateibeginn 3 zeichen ein. steht dort kein "TAG" ->dateilänge checken -> file_len
und dann ne schleife:for ( dekr = 3; dekr<file_len; dekr += 1 ) { if ( fseek( fp, -dekr, SEEK_END ) ) { perror("fseek failture"); } if ( 3 != fread( buf, sizeof(char), 3, fp ) ) { printf("fread < 3\n" ); fclose(fp); return 1; } if ( strcmp( "TAG", buf ) == 0 ) { printf("TAG found at pos: %lu\n", file_len - dekr ); break; } }
die bedingug dekr<file_len ist nur für deine test-textdatei sinnvoll
mfg a.
-
zur Schleife : Also sie erfüllt ihren Zweck, nämlich nur den Namen der ausfürbaren Datei und als zweiten Parameter die .mp3 Datei übergeben. Oder was meinst du mit sinnlos ? Das man das auch hätte anders schreiben können ? Ich versteh nicht ganz was du meinst.
zum Speicher : Ich dachte ich sage mit der Anweisung "while(fgets(Buffer,numChars,dat)" das er solange wie Buffer vorhanden ist( also eben die Zeichen an numChars ), die Datei einlesen soll.Also ich hab damit gerechnet, das er nicht genügend Speicher zur Verfügung hat wenn ich nicht auf diese Weise Speicher freigebe. Oder wie geht das richtig ?
Danke für den Code, aber eigentlich funktioniert meiner ja auch, halt nur mit selbsterstellten Textdateien
Außerdem bekomme ich das mit deinem Code irgendwie nicht so auf die schnelle hin, naja ich glaube ich lass es fürs erste gut sein und freue mich das ich es wenigstens mit Textdateien geschafft habe ^^
-
hya !
diese for-"schleife" ist überflüssig:
for(i=1;i<2;i++)
das weglassen dieser "schleife" ändert nichts am programmablauf, wenn du [i] mit [1] ersetzst.diese while-"schleife":
while(fgets(Buffer,numChars,dat))
ist ebenfalls überlüssig, eildieweil du die dateilänge ja schon in numChars gespeichert hast und ein
fgets(Buffer,numChars,dat)
dir bereits die komplette datei in den puffer kopiert.diesen cast:
Buffer = (char*)malloc(numChars);
tut man nicht machen tun, weil damit fehler verschleiert und schwer auffindbar gemacht werden können.
ein
Buffer = malloc(numChars);
ist c-like korrekt
-
Jo stimmt, die for Schleife war tatsächlich sinnlos, das mit der while Schleife peil ich nicht. Ich hab jetzt einfach das mit dem numChars weggelassen und lese in einen Buffer[100] ein. Danke für die Hilfe
Wenn ich das (char*) bei malloc weglasse, bekomme ich einen Kompilerfehler, liegt wohl daran das ich ne .cpp Datei verwende. Kann ich überhaupt mit Visual Studio reines C kompilieren ? geht glaub ich gar net...
-
toxor schrieb:
Kann ich überhaupt mit Visual Studio reines C kompilieren ? geht glaub ich gar net...
doch, das geht. du musst die file extension in .c umbenennen. dann nimmt er automatisch den C(89) compiler.
-
Ah ok thx, werds mal probieren.
-
toxor schrieb:
...das mit der while Schleife peil ich nicht...
wieso nicht ?
das ist so: du holst dir doch die anzahl der zeichen der datei so:
numChars = ftell(dat);
dann setzst du den dateizeiger an den anfang, und holst dir mit malloc:
Buffer = malloc(numChars);den puffer für die datei. hier fällt mir gerade noch ein, das du lieber
malloc(numChars+2) schreiben solltest. wegen dem nullterminator und dem newlinezeichen das fgets frecher weise in den puffer ans ende kopiert.soooo und dieser aufruf:
fgets(Buffer,numChars,dat)
bedeutet in worten: kopiere mir so viele zeichen, wie in numChars gespeichert sind aus der datei auf die dat zeigt, in Buffer hinein.mit diesem einen aufruf hast du die komplette datei in den puffer kopiert, dafür ist keine schleife nötig. ganz einfach ne.