Einlesen von Text aus Textdatei



  • Hi!

    Ich möchte eine 16 MB große Textdatei in eine CString Variable namens text speichern.
    Im Moment mache ich dies folgendermaßen:

    Öffnen der Textdatei mit

    ifstream textDatei("GenCode.txt", ios::in);
    

    Länge der Textdatei bestimmen

    //Länge der Textdatei bestimmen
    	 textDatei.seekg (0, ios::end);
    	 length = textDatei.tellg();
    	 textDatei.seekg (0, ios::beg);
    

    Einlesen jeder einzelnen Zeile in die CString Variable text

    while(getline(textDatei,line))
        {
    	 this->text += line.c_str();
        }
    

    Problematisch ist, dass eine 16 MB Textdatei um die 1000.000 Zeilen besitzt, ihr könnt euch also denke ich vorstellen, dass das Ewigkeiten dauert, bis die endlich gespeichert wird.

    Meine Frage: Kennt ihr zufällig eine schnellere Lösung, um einen Text mit so vielen Zeilen zu speichern?
    Wenn ja wär ich für jede Hilfe sehr dankbar.

    mfg enne



  • Was willst Du mit einer 16 MB Text Datei im Arbeitsspeicher bewirken?

    Gruss, Gio



  • Schau dir mal die Klasse CMemFile an. Diese sollte das sein was du suchst.

    Gruß Matthias



  • Super, vielen Dank 🙂



  • Wenns schnell gehen soll und zeilenweise Verarbeitung benötigt wird, mach ich immer sowas in der Art:

    // quick'n dirty, ohne Fehlerbehandlung!!!
    // es soll nur die Vorgehensweise verdeutlicht werden
    //
    CFile inFile("test.txt", CFile::modeRead);
    CArchive archive(&inFile, CArchive::load, inFile.GetLength());
    CString line;
    while (archive.ReadString(line))
    {
            // mach was mit der Zeile in <line>
    }
    archive.Close();
    inFile.Close();
    

    Hab ich jetzt so aus dem Kopf runtergekloppt, ich hoffe, es sind nicht zu viele Fehler drin.



  • jencas schrieb:

    Wenns schnell gehen soll und zeilenweise Verarbeitung benötigt wird, mach ich immer sowas in der Art:

    // quick'n dirty, ohne Fehlerbehandlung!!!
    // es soll nur die Vorgehensweise verdeutlicht werden
    //
    CFile inFile("test.txt", CFile::modeRead);
    CArchive archive(&inFile, CArchive::load, inFile.GetLength());
    CString line;
    while (archive.ReadString(line))
    {
            // mach was mit der Zeile in <line>
    }
    archive.Close();
    inFile.Close();
    

    Hab ich jetzt so aus dem Kopf runtergekloppt, ich hoffe, es sind nicht zu viele Fehler drin.

    Hi!

    Diese Möglichkeit ist sehr gut, komischerweise steht aber in der Variable "line" nur so komisches Zeugs wie % oder Quadrate drinnen.

    Muss ich das eventuell noch irgendwie konvertieren?

    lg enne



  • Sorry, wenn ich mich sehr ungenau ausdrücke.

    Folgender Code sollte doch eigentlich funktionieren oder?

    void CAdressbuchstabenInterpretation::HoleText()
    {
            CString line("");
    
            CFile inFile(_T("Code3.txt"),CFile::modeRead);
    	inFile.SeekToBegin();
    
    	CArchive archive(&inFile, CArchive::load);
    	archive.ReadString(line);
    }
    

    Das funktioniert nur nicht, da in der Variable line nur eigenartige Zeichen gespeichert werden.



  • Ich hab hier gerade mal ein kleines Beispielprogramm in VC2005 mit einer exakten Kopie des von mir geposteten Codes gemacht, läuft einwandfrei. Ich habe allerdings bei der Erzeugung des Projektes die Unterstützung für Unicode abgeschaltet. Kann es sein, dass bei Deinem Projekt Unicode eingeschaltet ist?



  • Ah stimmt, jetzt funktionierts, danke jencas 😉



  • Kein Problem, dafür sind wir ja hier 😉


Log in to reply