Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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

Was meinst du damit "ohne das Ganze in ein Array zu legen"?

Er meint damit, dass er die Datei vor der Suche nicht in den Speicher einlesen will.

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;

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.

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.

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.

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.

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);

hat sich erledigt. auf einmal gehts...:-)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.