Anwendung reagiert nicht mehr



  • 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