Cos Geschrieben 8. Dezember 2005 Geschrieben 8. Dezember 2005 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. Zitieren
Guybrush Threepwood Geschrieben 8. Dezember 2005 Geschrieben 8. Dezember 2005 strtok ist nicht dafür gedacht um einen String in einem anderem zu finden sondern um einen String durch Trennzeichen in mehre Teilstücke zu zerlegen. Guck dir mal strstr() an damit sollte das ganze besser klappen. Zitieren
Cos Geschrieben 8. Dezember 2005 Autor Geschrieben 8. Dezember 2005 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 Zitieren
Guybrush Threepwood Geschrieben 8. Dezember 2005 Geschrieben 8. Dezember 2005 Was meinst du damit "ohne das Ganze in ein Array zu legen"? Zitieren
Bubble Geschrieben 8. Dezember 2005 Geschrieben 8. Dezember 2005 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. Zitieren
Cos Geschrieben 9. Dezember 2005 Autor Geschrieben 9. Dezember 2005 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; Zitieren
Exodus Geschrieben 9. Dezember 2005 Geschrieben 9. Dezember 2005 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. Zitieren
Cos Geschrieben 12. Dezember 2005 Autor Geschrieben 12. Dezember 2005 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. Zitieren
Klotzkopp Geschrieben 12. Dezember 2005 Geschrieben 12. Dezember 2005 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. Zitieren
Cos Geschrieben 12. Dezember 2005 Autor Geschrieben 12. Dezember 2005 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. Zitieren
Cos Geschrieben 12. Dezember 2005 Autor Geschrieben 12. Dezember 2005 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); Zitieren
Cos Geschrieben 12. Dezember 2005 Autor Geschrieben 12. Dezember 2005 hat sich erledigt. auf einmal gehts...:-) Zitieren
Empfohlene Beiträge
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.