Anwendung reagiert nicht mehr



  • Ich bin zu dumm, ich hab keine deutschen Hilfen zu einer ander Fileopen Funktion gefunden.
    Ich weiss nicht wie ich da zb. 1024 bytes einlese,die in ein Array packe oder so.
    Ich muss doch alles einzeln einlesen.
    Ich hab 2 Dateien:
    In einer sind die Werte drin nachdem ich suche.
    00112233|§4§|ff001020|§4§|00008822|§4§|

    Das ist mein String 2 Zahlen ergeben immer ein Ascii Wert.
    Die 4 zwischen den § gibt so eine Joker Zeichen an,also 4 bytes überlesen dann weiter suchen.

    Und ich weiss echt nicht mehr,wie das anders Regeln kann.

    Ohne das jetzt bestehende zu verwerfen.



  • Joe_M. schrieb:

    <fullquote gelöscht>

    Ungefähr so würde es klappen die Daten in einem Rutsch einzulesen. Wo ist das Problem den Code zu kopieren und einzufügen? 🙄

    Edit:
    Zitate bitte auf das Notwendigste beschränken. Danke!



  • Also ich hab' jetzt hier keinen BCB zum nachsehen, aber auch fstream müßte eine Read-Funktion haben, mit der man eine definierte Anzahl Zeichen einlesen kann (obwohl sie möglicherweise nicht Read heißt...).

    Zu dem Suchproblem: Also suchst Du nicht nach einer Zeichenfolge, sondern nach mehreren Zeichenfolgen, die in einer bestimmten Relation zueinander stehen. Sehe ich das richtig? Hast Du dir den Boyer-Moore-Horspool Algorithmus schon angesehen?



  • Ich glaube ihr versteht mich nicht.
    Ich versteh nicht wie man, sowas im string suchen soll.
    Der String muss auch binär Werte aufnehmen können.
    Und ich glaube ich rall grad was total nicht.
    Ich brauch dann den Offset wo der String vorkommt.
    Den will ich in eine Datei schreiben,die Offset Angaben da,benötige ich um zB.
    zu sehen, wo welche Vorkomnisse waren.



  • ich glaube du solltest dir noch mal ein paar C++ Grundlagen zu Arrays/Strings durchlesen.

    Du kannst auch auf einen String vom Typ std::string oder AnsiString mittels dem Index-Operator zugreifen.

    Und so kann man damit beipielsweise arbeiten

    char c[21] = "Hallo, Welt!";
    char erg;
    for(int i = 0; i<as.Length(); ++i)
    {
       if(c[i] == '!')
       {
          reg = c[i];
       }
    }
    


  • the_hero99:
    Versteif dich nicht auf deinen kompletten Suchstring inklusive der "Joker".

    Finde erstmal nur den Teilstring bis zum ersten Joker. Wenn du den gefunden hast kannt du die Zahl-der-Joker-Zeichen überspringen und prüfen, ob die folgenden Zeichen mit dem zweiten Teilstring übereinstimmen. Wenn ja, dann machst du so weiter bis ggf. zum letzten Teilstring. Wenn nicht, dann kehrst du zur Suche nach dem ersten Teilstring zurück und machst da weiter.



  • @Pupetmaster das man mit ansistring spezielle Positionen anspringen kann,weiss ich ja.

    Daher war ja meine Idee die ganze Datei einzulesen, um die dann auszuwerten.
    (war meine allererste Idee).
    Nur wie ich sagte,habe ich da bedenken bei Datein von 2Gb oder mehr.

    Jetzt habe ich noch eine andere Idee,wie wär es wenn man den ganzen Kram wie schon gesagt Blockweise einliest,und dann immer die Blocks durchsucht(da gibt es ja zu ansistring gute Funktionen).

    Ob der Suchstring dann am Ende des Blocks beginnt,könnte man ja abfangen oder abfragen.

    Nur mein problem ist,ich habe nirgens eine gute Anleitung zu andere Fileopen Funktionen gefunden.
    Mal dies mal das,nie ne richtige Anleitung oder gute deutsche Erklärung.

    Wenn da vielleicht einer ein Link hätte,wäre ich sehr dankbar.



  • Die FAQ vom C++ Forum wäre hier angebracht. Und dann würde ich mich an das halten was Jansen in seinem letzten Post geschrieben hat!

    Oder du nimmst das Beispiel von Joe_M. Er arbeitet dort mit TFileStream (kann man nachlesen in der BCB-Hilfe)



  • Ich gebs auf.

    Ich komm mit den ganzen Mülllllllllllllll nicht mehr klar.

    ICH RALL DAS EINFACH NICHT.

    Sorry wenn das unhöflich war nur ich rall, das alles nicht.

    Ich kenn nur fstream mit get und put bzw.>> << mehr nicht.

    In Builder kann ich LoadFromfile und co.

    Aber ich versteh nur nicht, wie man da Offsets und Blocks lesen kann.

    die Beispiele von Joe_m sind sehr gut.
    Nur leider versteh ich nix was da passiert,bzw. wie ich da binär auslesen,einzelne zeichen schreibe,zum Offset springe usw.

    Wenn ich das könnte, wäre mir ja schon sehr geholfen.

    Auch wenn dann die ganze Suchroutine die ich geschrieben habe(200 Zeilen) hinfällig wäre.

    Ich denk mal wenn ich bis morgen das Problem nicht gelöst habe, lass ich es sein.
    Dann habe ich da über 5 tage rumgefummelt,ohne ein Ergebnis.



  • char pBuffer[1024];
    fstream FileBin("d:\\cdtemp\\streams\\test.dat",ios::in|ios::out|ios::binary); 
    if (FileBin.is_open()) 
    FileBin.seekp(ios::beg);
    { 
         FileBin.read(pBuffer, 1024); 
    
        // Hier string auswerten; 
    
    }
    

    Liege ich jetzt richtig, das ich so immer 1024 zeichen auf einmal einlese?

    Weil wenn es so ist,wäre ja mein verständnis Problem fast gelöst.



  • Nicht ganz du hast da noch ein paar Macken drin.

    char pBuffer[1024];
    fstream FileBin("d:\\cdtemp\\streams\\test.dat",ios::in| ios::out| ios::binary); 
    while (FileBin)  //so wird die Schleife beendet sobald ein Fehler auftritt
    { 
         FileBin.read(pBuffer, 1024); 
    
        // Hier string auswerten; 
    }
    

    In pBuffer kannst du jetzt nach deinen Werten suchen.



  • Der pBuffer ist um ein Zeichen zu klein (an die Null-Terminierung denken!).



  • Also ich habe jetzt nur mal an der Puffergrösse geschraubt,und habe mit ein Puffer von 1000 die Datei gelesen und eine neue geschrieben,in paar Sekunden.

    Also erstmal nen Thx an Puppetmaster,JOE_M und Jansen.

    Dadurch das man das per Block einlesen kann,hätte ich auch in meinen Vorgänger Projekten einiges an Speed rausholen können.



  • Jansen schrieb:

    ...(an die Null-Terminierung denken!).

    Also nagelt mich nicht fest, aber unter Verwendung von TFileStream muß keine NULL-Terminierung berücksichtigt werden. Allerdings kann man dann auch nicht strcpy() verwenden, sondern muß memcpy() nehmen.

    Von der Verwendung von String() oder char-Funktionen muß ich dringdend abraten, da es sich offenbar um eine binäre Datei handelt (zumindest dem 'Suchstring' nach zu urteilen.



  • Jansen hat das jetzt speziell auf mein Beispiel bezogen und da habe ich ein char-Array verwendet 🙂



  • Nun bin ich froh das ich,eine Datei per Blocks auslesen kann.
    Nun sagt JOE_M das er das nicht machen würde?
    Warum ich habe an ein Datenpuffer von 25MB gedacht, würde selbst bei 196MB RAM
    keine Probleme hervorrufen.
    Und grade das char array würde sich hier,bei meinen Code, optimal anbieten.
    So kann ich biss auf ein paar Änderungen meine Suchroutine übernehmen.
    Und da hier auch Binärwerte gefressen werden,weiss ich nicht was daran schlecht ist.



  • Nun bin ich froh das ich,eine Datei per Blocks auslesen kann.
    Nun sagt JOE_M das er das nicht machen würde?

    Nein das habe ich nicht gesagt. Ich habe gesagt, Du sollst keine String- oder char-Funktionen verwenden. Damit meinte ich, dass Du keine Funktionen wie strcpy, strcmp, AnsiPos usw auf den Puffer anwenden sollst, da dieser binäre Daten erhält - und das kann und wird zu unvorhersehbaren Ergebnissen führen.

    Allerdings habe ich auch festgestellt, dass fstream tatsächlich einen char* als Puffer verwendet. Ich weiß nicht, ob das nicht bereits Probleme bei binären Daten gibt. TFileStream erwartet den Puffer als void*. Es wird zwar trotzdem char* verwendet aber dieses muß nach void* ge'castet' werden. Aber da man der fstream.read ebenfalls die Länge übergeben muß, hoffe ich, dass es funktioniert.



  • Also die Datei, die ich auslesen will, kann ich mit read/write binär einlesen und schreiben.



  • So also ich habe das Tool,seit heute in einer Beta Version laufen.

    Und jetzt ein Mega fettes THX an allen die mir geholfen haben. 😃 😃 🙂 🙂


Anmelden zum Antworten