CStdioFile->Bug gefunden??



  • Wenn ich versuche, eine ca 60MB große Textdatei mittels
    CStdioFile::ReadString zu lesen, bekomme ich nur Müll zurück,
    d.h. der gelesene String enthält nur seltsame Zeichen.
    Versuche ich das gleiche mit einer kleineren Datei, klappt´s wieder;
    es liegt also nicht am Code.
    Gibt´s denn eine größenbeschränkung für CStdioFile??
    Ich komme nicht darum herum, die Datei zeilenweise zu lesen.
    Welche Alternativen gibt´s denn??



  • Original erstellt von <Susanne>:
    Versuche ich das gleiche mit einer kleineren Datei, klappt´s wieder;
    es liegt also nicht am Code.

    Diese Schlussfolgerung ist nicht ganz richtig, außer die kleine Datei entspricht in ihrem Inhalt dem Anfang der großen Datei.

    Liest Du vielleicht eine ANSI-Datei als UNICODE ein? Bist Du sicher, dass es sich bei der großen Datei um eine reine Textdatei handelt (mal im VC als "binary" öffnen, um das zu prüfen)?



  • Versuchs mal hiermit. Manchmal ist sowas besser als CStdioFile.

    // Datei öffnen und zeilenweise auslesen
    FILE* file;
    if((file = fopen(lpszPathName, "r")) != NULL)
    {
      char line[4096];
      while(fgets(line,4096,file))
      {
        CString strLine(line);
        //... hier irgendwas mit der Zeile anstellen
      }
    
      // Datei schließen
      fclose(file);
    }
    


  • @MFK
    Ja, es sind beides Textdateien. Ganz sicher.
    Ich verwende den gleichen Code, den ich schon 1000mal verwendet habe.
    Bei so einem Posting denke ich immer, ich werde **wahrscheinlich ausgelacht.
    Aber das gefährliche ist halt: Wenn ich die Textdatei zur Laufzeit des Programmes erstelle, und auf meinem Rechner hat sie dann angenommen 20MB, funktioniert das ganze **wahrscheinlich noch, und ich würde an dieser Stelle nie einen Fehler vermuten.
    Benutzt sonstwer mein Programm auf einem anderen Rechner, hat sie evtl. 60MB. Dann geht nichts mehr.
    Checkt das doch mal aus.

    @MaSTaH
    Klingt gut. thx****



  • @Susanne wärs vielleicht nicht besser die Daten so aufzuteilen
    das sie in mehreren Dateien sind, oder sie zukompremieren ?

    Devil



  • Soll heißen, dass du 60MB "mal ebend" in den Arbeitsspeicher schreibest? Dann nimm doch lieber die Lösung von MaSTaH und arbeite alles in keineren Portionen ab. Stell dir vor die Datei wäre 1GB groß ...

    Achja, könnte evtl am String liegen, da Länge ein int ist, kann es sein, das 60MB nicht verarbeitet werden können.



  • @Susanne:
    Ich habe gerade mal eine 104 MByte große Textdatei (etwa 900.000 Zeilen) sowie einen 4 MByte langen Einzeiler getestet: Die große Datei hat ReadString problemlos gefressen, den Einzeiler habe ich nach 20 Minuten mit voller Prozessorauslastung abgebrochen. Ein Fehler, wie von Dir beschrieben, trat nicht auf.
    Vielleicht zeigst Du uns doch mal den relevanten Teil des Codes oder einen Hexdump der ersten paar Dutzend Bytes der großen Datei...



  • Hallo zusammen,

    mal abgesehen von der Technik, den String komplett einzulesen, sollten rein von der Klasse CString her gesehen, die Probleme erst bei INT_MAX (=2147483647) Zeichen/ Bytes losgehen.

    Soviel Zeichen verwaltet ein CString (s. MSDN).

    Gruß, Volle.



  • Oh, sorry.
    Vielleicht hätte ich mich doch nicht so weit aus dem Fenster lehnen sollen:
    Die Datei enthält tatsächlich Steuerzeichen, ist also keine "echte" Textdatei.
    😃 [schwitz]

    O.k. Dann hab´ ich ein anderes Problem:
    Also : Die Datei ist eine komplette Registry-Exportierung; angefertigt über Kommandozeilenübergabe an Regedit.
    Ich hatte den kompletten Inhalt in eine leere Textdatei kopiert, und dabei den Hinweis erhalten, das dadurch die Formatierung verloren gehen würde.
    Kann ich trotzdem irgentwie diese Datei zeilenweise einlesen??
    Mit der Methode von MaSTaH ging das dann auch nicht.


Anmelden zum Antworten