Dialog/BUFFER



  • Habe mir Dialogabasierend ein Programm geschrieben indem ich Dateien nach einem vorgegebenen String durchsuchen möchte.

    Den Inhalt einer Datei soll Blockweise (BUFFER 8000) in einen BUFFER eingelesen werden.
    In der For-Schleife schmiert das ganze dann aber ab.Folgende Nachricht taucht dan auf:
    Unhandled exception in Finder.exe

    Woran liegt das???
    Danke für Eure Hilfe!!!!

    Im Header:

    #define MAX_GRABBER_BUFFER 8000

    Protected:
    unsigned char chBuf[MAX_GRABBER_BUFFER];

    void CFinderDlg::ScanFile()
    {
    FILE* fpFile = NULL;
    int nObjectsRead = 0;
    BOOL bEOF = FALSE;

    fpFile = fopen (strScanFile, "rb");
    if (fpFile == NULL) return;

    fseek (fpFile, 0, SEEK_END);
    fileSize = ftell (fpFile);
    rewind (fpFile);

    while (bEOF == FALSE)
    {
    MessageBox ("Bis hier gehts");
    // for (unsigned long u = 0; u < MAX_GRABBER_BUFFER; u++)
    // chBuf[u] = 0;

    nObjectsRead = fread (chBuf, sizeof(unsigned char), MAX_GRABBER_BUFFER, fpFile);
    if (nObjectsRead < MAX_GRABBER_BUFFER) bEOF = TRUE;

    // ScanBuffer();

    filePos += MAX_GRABBER_BUFFER;
    }

    fflush (fpFile);
    fclose (fpFile);

    if (nObjectsRead != 1) return;
    }



  • was mir da grad so auffällt,
    du sagts ihm in der zeile

    fseek (fpFile, 0, SEEK_END);
    

    das er ans ende der datei springen soll, wo bestimmt kein einzigstes byte liegt das du auslesen könntest 😉



  • Er hat doch rewind drin.



  • Erstens: Wozu bestimmst du denn die Dateigröße? (@LowFly: Das funktioniert wirklich - rewind() setzt den Lesezeiger wieder auf den Anfang)

    Zweitens: Stürzt das Programm beim Einlesen ab oder bei der anschließenden Weiterverarbeitung der Daten? Und in welcher Schleifenrunde?

    Drittens: Eventuell solltest du umsteigen auf C++ Methoden - fstream ist imho sicherer als FILE*

    PS: sizeof(unsigned char)==1 und fflush() brauchst du nur für Ausgabefiles.

    PPS: sfds



  • wuste nicht das rewind das bewirkt


  • Mod

    Viertens: Geht der Algorithmus in die Hose, wenn sich der zu suchende Wert über zwei Lesezugriffe verteilt. Also wenn ein Teil der zu suchenden Daten im einem Block am Ende und der nächste Teil im nächsten Block liegt.
    Das funktioniert so, nur wenn die Daten auch an diese 8000 Bytes Grenze alligned sind!



  • In der Kopfgesteuerten While-Schleife befindet
    sich in der ersten For-Schleife.
    Dort soll der Buffer vollgeschrieben werden und in einer
    Methode ScanBuffer, die ich im moment noch auskommentiert
    habe nach einem vorgebenen String durchsucht werden.

    Im Debug-Modus springt er mir nach 200 Schleifendurchläufe raus (sollte eigentlich bis 8000) und zeigt mir den Fehler:

    Unhandled Exception in Finder.exe(Mein Programmname)

    an.

    Entweder liegt der Fehler vor der Schleife, oder er hat probleme
    mit dem BUFFER(8000)??????????????????????



  • werbue schrieb:

    Im Debug-Modus springt er mir nach 200 Schleifendurchläufe raus (sollte eigentlich bis 8000) und zeigt mir den Fehler:

    Der 200. Durchlauf wovon? Meinst du die momentan auskommentierte for-Schleife oder die große while-Schleife?

    Eventuell hast du auch ein Problem damit, daß dein Zeichen-Puffer nicht null-terminiert ist - und die Stringverarbeitungs-Funktionen in der ScanBuffer() über's Puffer-Ende hinauslesen.



  • Ich meine die auskommentierte For-Schleife.

    Die Methode ScanBuffer() ist auch auskommentiert.


Anmelden zum Antworten