Fehler in Anwendung beim einlesen großer Text Datein



  • Hallo,
    ich habe ein Programm geschrieben was ein Logfile analysiert. Diese Logfiles können bis zu 25MB groß werden. Wenn ich kleine Datei einlese (500kB) geht es blasenfrei, sind die Datein 10MB oder größer kommen am ende folgende Fehler:

    Die Ausnahme "Unbekanter Softwarefehler"(0x0eedfade) ist in der Anwendung an der Stelle 0x77e7a4e1 aufgetreten.

    Diese Meldung kommt zwei mal.

    Auch wenn ich alles rausschmeisse und nur die Datei öffne un im Konsolenfenster ausgebe kracht es aber erst ganz am ende!

    Liberis
    #include <vcl.h>
    #include <condefs.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream.h>
    #include <fstream.h>
    #include <conio.h>
    #pragma hdrstop
    .
    .
    .
    AnsiString Param1 = ParamStr(1);
    AnsiString Param2 = ParamStr(2);
    ifstream infile;
    infile.open(Param1.c_str());

    if (!infile) { // Datei vorhanden ?
    cout << "Datei " << Param1.c_str() << " nicht gefunden !" << endl ;
    return 0;
    }

    while (!infile.eof()) {
    infile.getline( cs, sizeof(cs) );
    }

    infile.close();
    return 0;

    So sieht es aus ... leicht eingekürzt.

    😞 Wer kann mir da was zu sagen ? Denke hat was mit dem Speichern oder dem schließen der Datei zu tun.

    Gruß Ralf



  • Das ganze sieht mehr nach C++ aus, als nach BCB (einzig vcl.h und AnsiString). Verrat mir bitte mal was cs ist? Ein char oder char[]? Ein string?

    Einlesen würde ich außerdem so:

    std::string line;
    while(getline(infile, line))
    {
       //mach was mit line
    };
    

    oder so

    for(std::string line; getline(infile, line); )
    {
       //mach was mit line
    }
    

    weil eof() nur angibt ob das eof-Bit gesetzt ist und sonst nichts. Daher sollte man entweder noch das failbit abfragen oder es auf die genannte Weise versuchen. Diese prüft nämlich implizit auf fail() 😉

    Edit: Die abschließende Klammer für while fehlte...



  • Ich weiß nicht mehr, warum ich das mal wie folgt gemacht habe, aber auf jeden Fall kann ich damit Dateien bis 1 GB Größe problemlos einlesen. Drüber habe ich nicht getestet. 190 MB einlesen dauert nicht ganz 3 1/2 Sek.

    AnsiString asFileNameAndPath = "c:\\sltest.txt";
    TFileStream* myfs = NULL;
    char* myfsbuf = NULL;
    int myfsbuf_size = 1024;
    int myfsbuf_read;
    try
    {
    	try
    	{
    		myfs = new TFileStream(asFileNameAndPath, fmOpenRead);
    		myfsbuf = new char[myfsbuf_size];
    		myfs->Position = 0;
    		do
    		{
    			myfsbuf_read = myfs->Read((void*) myfsbuf, myfsbuf_size);
    			// Daten auswerten
    		} while (myfsbuf_read == myfsbuf_size);
    	}
    	catch(...)
    	{
    		ShowMessage("Fehler beim Lesen der Datei.");
    	}
    }
    __finally
    {
    	if (myfs)
    		delete myfs;
    	if (myfsbuf)
    		delete[] myfsbuf;
    }
    


  • Danke für die Unterstützung, jetzt läuft es.


Anmelden zum Antworten