tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
3
ZUGRIFFE
853
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Sturmkoenig Sturmkoenig ist offline Grünschnabel
    Registriert seit
    Mar 2004
    Beiträge
    4
    Hallo zusammen,
    ich versuche gerade größere Dateien mit möglichst kleinem Speicheraufwand in Arrays einzulesen, nur stoße ich hierbei auf ein Problem:
    wenn ich die Zeilen in der 2. Schleife einlesen lasse, kommt nichts Gescheites dabei herraus, d.h. es kommt praktisch gar nichts ins Feld.
    Wenn ich es aber in der oberen Schleife rausschreiben lasse, geht es problemlos.

    Ich hoffe ich nerve nicht zusehr mit dieser Anfängerfrage...

    Vllt. könnt ihr mir auch gleich erklären wie man es insgesamt besser machen kann, viel Text sauber in Arrays zu lesen. Danke im Vorraus.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    ifstream lesen(datei, ios::in);
        if(lesen.good()) {
            lesen.seekg(0L,ios::beg);
     
            m_strMultiline += "Caching File...";
     
            while(!lesen.eof()) {
                num_lines++;
                lesen.getline(zeile_temp, 300);
                //m_strMultiline += zeile_temp;
                laenge_bin=strlen(zeile_temp);
                if(laenge_bin>laengste_zeile) laengste_zeile=laenge_bin;
            }
     
            char** zeilen = new char*[num_lines];
            for(int i=0; i<num_lines; i++)
                zeilen[i] = new char[laengste_zeile];
     
            m_strMultiline += "Reading File...";
     
            lesen.seekg(0L,ios::beg);
            num_lines=0;
            while(!lesen.eof()) {
                lesen.getline(zeilen[num_lines], laengste_zeile);
                m_strMultiline += zeilen[num_lines];
                num_lines++;
            }
        }
     

  2. #2
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Eine erprobte Möglichkeit ist folgende:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
        std::vector<char> buffer;      //- einen char-vector als buffer machen
      
        //- Datei in Stringstream lesen
        ifstream is( strProject.c_str() ); //- strProject ist ein std::string mit dem Dateinamen
        if ( !is.good() ) return false;
     
        //- Größe feststellen
        is.seekg( 0, ios_base::end );         //- aufs Ende setzen
        int size = is.tellg();                //- size enthält jetzt die Anzahl von Bytes in Datei
        if ( size < 1 ) return false;         //- lohnt nicht, abbruch
      
        is.seekg( 0, ios_base::beg );         //- wieder auf Anfang setzen
     
        buffer.resize( size + 1 );            //- buffergrösse korrigieren
        is.get( &buffer[0], size + 1, '\0' ); //- alles auf einmal in buffer lesen
    Danach hast du einen std::vector von chars, der die komplette Datei enthält. Ich habe diese Methode vor zwei Jahren getestet und sie hat unter verschiedenen anderen Varianten die besten Ergebnisse erbracht bei Dateien > 1MB. Es würde mich interessieren, ob es da noch was Fixeres gibt, das mir entgangen ist.

    (Dass die Buffergrösse erst nach Konstruktion des Buffers erfolgte, hatte programmtechnische Gründe, auf die ich hier nicht eingehen kann.)
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

  3. #3
    Sturmkoenig Sturmkoenig ist offline Grünschnabel
    Registriert seit
    Mar 2004
    Beiträge
    4
    Großes Lob für dieses Lösungsweg!
    Darauf wäre ich mit meinen Anfängerkenntnissen nie gekommen.
    Nur stellt sich für mich nun die Frage, wie ich nun die einzelnen Zeilen in Arrays aufspalten kann, so wie ich das am anfang vorhatte?
     

  4. #4
    Registriert seit
    Jul 2003
    Ort
    Duisburg (NRW)
    Beiträge
    1.788
    Der Text befindet sich zu diesem Zeitpunkt ja bereits im Speicher. Du kannst die Zeilen trennen, indem du darin nach '\n' suchst - dem Zeilentrenner. Du könntest auch einen istringstream benutzen (wie mit einem File, aber Eingabe aus string).

    Übrigens ist mein Lösungsvorschlag eigentlich nicht so besonders speichereffizient - er ist aber schnell. Das war nämlich der Grund, warum ich optimiert hatte. Ich hatte mich bei deinem Post wohl verlesen, oder vielleicht tue ich es jetzt. Tut mir leid, falls die Lösung zu viel Speicherplatz benötigt, es ist jedenfalls keine schlechte Lösung.
     
    Chor: "Wir sind der Chor, und wir stimmen zu. Wir stimmen zu, wir stimmen zu, wir stimmen zu."

Ähnliche Themen

  1. Formupload große Dateien
    Von kevkev im Forum PHP
    Antworten: 12
    Letzter Beitrag: 17.10.06, 18:45
  2. [C++] große Dateien (>2 GB) lesen
    Von Onkel Schuppig im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 04.11.05, 11:21
  3. Große Dateien bearbeiten!?
    Von tYrEaL im Forum PHP
    Antworten: 2
    Letzter Beitrag: 21.06.05, 10:11
  4. Mega Große Dateien
    Von WietingDennis im Forum Videoschnitt, Videotechnik & -produktion
    Antworten: 2
    Letzter Beitrag: 16.01.05, 21:55
  5. FH Mx zerstört große Dateien
    Von PHeimann im Forum Vektor-Programme
    Antworten: 4
    Letzter Beitrag: 05.05.04, 07:36