Zum Inhalt springen

Problem mit strtok


Cos

Empfohlene Beiträge

Hallo zusammen,

ich bin auf der Suche einer Lösung für folgendes problem.

ich hab eine große Datei (soll heißen Array einlesen fällt weg, da das Array min 10 000 sein muss) die ich auslesen will bis zu bestimmten Punkten.

Also in der Datei steht das Wort

AudioSamplingRate = 22050/1

was ich suche. hab das ganze mit strtok versucht und das sieht folgendermaßen aus.

	Headfile = fopen((m_sTestFileName), "rb");

			fread( Head, sizeof( char ), 100000, Headfile );

			token = strtok( Head, stops );

			while( token != NULL )

			{

      tester.Format( " %s\n", token );

      token = strtok( NULL, stops2 );

			}

Die Deklaration der stops und des token folgen:
	FILE* Headfile;

	char stops[] = "AudioSamplingRate = ";

	char stops2[] ="/";

	char *token;

	CString tester;

Doch leider bekomme ich die zahlen nicht in meinen CString tester geladen...was mache ich falsch? Als Ergebnis steht {"øj/"} in tester...

danke für eure Hilfe.

Link zu diesem Kommentar
Auf anderen Seiten teilen

mit strstr finde ich ja die Position wo der String beginnt. Meinst du dann das ich dann ab dort auslesen soll. Wie kann ich das realisieren ohne das ganze in ein array zu legen?

PS: ich seh gerade das in meine quellcode noch das fread drin ist.das soll natürlich weg sein

Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau. Aber ich hab nun mal einen anderen Lösungsansatz versucht. Eigentlich wollte ich ja direkt aus der Datei lesen. Da gabs aber andere Probleme. Nun lese ich 10 000 Byte in ein Array ein, ist zwar groß aber hoffe das es geht. Nun nehme ich aber wieder deinen Lösungsansatz auf (strstr) und versuche in der Datei nach dem Code 3d03 zu suchen. Gestaltet sich aber bissl schwer. Vielleicht könnt ihr mir nochmal aushelfen.

Also die Datei ist eingelesen und ich hab das char-array strSample angelegt. In dem steht der Code 3d03. Nun will ich mit strstr nach dem Code suchen. Leider nimmt strstr (ist ja auch klar wegen string) nur strings an, aber ich möchte nach dem Hex-wert 3d03 suchen und nicht nach dem zugehörigen Ascii. Hat jemand eine Idee wie man das lösen kann.

Hier der code:


FILE* Headfile;

char strSample[] = "3D03" //Ist nur in Hochkomma wegen Test soll natürlich

// als Hex-Wert eingesetzt werden

char *pdest;

int  resultSample=0, resultChannel=0, resultBits=0, resultBps=0, resultBlock=0;

Headfile = fopen((m_sInputTest1), "rb");

fread( Head, sizeof( char ), 10000, Headfile );	

pdest = strstr( Head, strSample );

resultSample = pdest - Head + 1;

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich verstehe das Problem nicht ganz. Wenn also 3d03 in der Datei steht,

benutzt du strSample[] = "3D03". Wenn in der Datei der ASCII-Wert von 3d03 steht, wandelst du 3d03 in den ASCII-Wert von 3d03 um. Ob es dazu eine direkte Möglichkeit gibt weiss ich nicht, gestaltet sich aber denoch nicht als sonderlich schwierig. Du wandelst die Hexadezimale Zahl 3d03 zuerst in ihre Dezimalzahl um (Taschenrechner wenn es immer 3d03 bleibt, oder @Runtime). Das kannst du folgendermassen machen:


char strSample[] = "[U]0x[/U]3D03";  // WICHTIG: das '0x' nicht vergessen


// wir nutzen die Funktion strtol

char *cpEnd;                                 // erklär ich später

long l = strtol(strSample,&cpEnd,0);   // die Konvertierung

l behinhalted nun den Dezimalwert von strSample. Der Pointer cpEnd wird von der Funktion strtol auf den ersten non-numeric char in strSample gesetzt. Das kann zur Fehlererkennung genutzt werden, oder einfach um zu wiessen wo der Konvertierungsvorgang aufgehört hat. Parameter 3 ist der Radix, wenn er auf 0 steht, versucht strtol automatisch zu ermitteln, welche basis die Zahl die im String steht hat. Wenn wir also 0x3D03 benutzen, erkennt strtol anhand des 0x das der Radix 16 (Hexadezimal) ist. (l sollte noch auf LONG_MAX und LONG_MIN geprüft werden, um Überlauffehler auszuschliessen). Nun kann man auf die schmutzige Art und weisse die Dezimalzahl l einem String zuweisen:

char strSample[] = l;     // böse, aber funktioniert

Jetzt kannst du nach dem ASCII-Wert von 0x3d03 in deiner Datei suchen. Theoretisch gibt es noch eine einfachere Methode:

strSample[] = "3D03";

unsigned int i;

sscanf(strSample,"%2X",&i);

i beinhaltet nun den Dezimalwert von 3d03, und man kann ihn wie gehabt um-

wandeln. Da jedoch die scanf-Familie sehr Fehleranfällig ist und in vielen

Situationen unerwartete Ergebnise liefert, finde ich persönlich die strtol-

Methode besser.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

vielen Dank für deine Antwort, aber leider funktioniert es nicht. Jetzt ist die Frage woran das liegt. Erstens bekomm ich gar kein Ergebnis in den Pointer pdest. Wenn ich den Debugger starte kommt die Meldung beim Öffen der Variable :

CXX0030: Fehler: Ausdruck kann nicht ausgewertet werden

und ich erhalte keine Veränderung der variable wenn der Ausdruck

pdest = strstr( Head, strSample);

durchlaufen wird.

Also um noch einmal das Problem zu beschreiben weil ich es anscheinend nicht genau erklärt habe. Also ich möchte die Datei scannen. Es ist eine Video-Datei und in der Datei soll nach der Hexzahl 3d03 gesucht werden. Also nicht nach dem Ascii-Wert. Der Sinn davon ist das ich die Stelle finde in der Datei wo diese Zahl vorkommt und danach dann 4 Bytes auslesen möchte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Es ist eine Video-Datei und in der Datei soll nach der Hexzahl 3d03 gesucht werden. Also nicht nach dem Ascii-Wert. Der Sinn davon ist das ich die Stelle finde in der Datei wo diese Zahl vorkommt und danach dann 4 Bytes auslesen möchte.

Das kannst du nicht mit Stringfunktionen machen. Du hast eine Binärdatei, da kann potenziell das Stringende-Zeichen ('\0') drin vorkommen. Da bricht jede Stringfunktion, strtok oder strstr oder was auch immer, die Bearbeitung ab.

Lade die Datei blockweise in den Speicher und durchsuche den Block mit einer Schleife nach 3d. Wenn du 3d gefunden hast, prüfe, ob das nächste Byte 03 ist. Achte auf mögliche Trennung deines Suchmusters an der Blockgrenze.

Wenn du sicherstellen kannst, dass diese Bytekombination nur z.B. an geraden Dateipositionen stehen kann, kannst du auch wortweise vergleichen, das bringt einiges an Geschwindigkeit.

Link zu diesem Kommentar
Auf anderen Seiten teilen

also du meinst ich sollte die Auslesung mit 3 Schleifen realisieren.

Also ich lese das erste byte ein prüfe ob 3d (1.schleife)

if ja...2.schleife: nächstes Byte einlesen und prüfen ob 03. Falls ja 3. schleife 4 bytes auslesen und weiter verarbeiten...richtig?

ok ich probiers mal.

danke.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also das klappt...ist zwar umständlicher aber es geht. danke für die hilfe...

kurze frage noch wieso geht das hier nicht?

Er schreibt nichts in die Datei?

		head1 = fopen("header-standard1.dat", "a");

			unsigned char r1 = 'R';

			unsigned char r2 = 'I';

			unsigned char r3 = 'F';

			unsigned char r4 = 'F';

			fprintf(head1,"%c",r1);

			fprintf(head1,"%c",r2);

			fprintf(head1,"%c",r3);

			fprintf(head1,"%c",r4);

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...