Können Speicher volllaufen



  • Hallo,
    ich muß zugeben der Betreff ist nicht der tollste, aber mir ist nix besseres eingefallen. Hier also meine Frage:

    Ich schreibe gerad ein Programm, welches http- Adressen aus einen txt-Dokument auslesen soll.
    Zunächst habe ich die Datei eingebunden:
    -ifstream aol ("AOL.txt");

    Dann lese ich die einzelnen Zeichen aus:
    -char scan[1];
    -aol.read(scan,1);

    und suche hieraus mit 4 IF- Schleifen die Zeichenfolge "http" heraus, um anschließend alle Zeichen nach "http" bis zum ersten LEERZEICHEN auszulesen (um die komplette E- Mail- Adresse zu erhalten.

    Das funktioniert soweit auch gut, nur arbeitet es nur etwa die hälfte des Textes durch.

    Diese Zeichenauslese- Sache habe ich in eine FOR- Schleife gepackt mit der Bedingung :
    -!aol.eof()

    Da mit dieser Bedingung alleine die Schleife auf Mysteriöse weise zu einer Endlosschleife wird habe ich noch eine Zusatzbedingung gestellt. Ich lese mit aol.tellg() die aktuelle Curserposition aus. Bei ca. 47500 jedoch verändert diese sich nicht mehr, also hab ich einen Schleifenabbruch bei gleicher Curserposition eingegeben.

    Eigentlich müßte die Curserposition ja weiter steigen und am Ende des Textes den Wert -1 erhalten.

    Vielleicht kann mir jemand von euch sagen woran dies liegt, da ich dies für die Ursache des Problems halte.

    MfG
    Patrick



  • Wäre gut, wenn du den entsprechenden Code posten könntest.
    Ansonsten nur ne Frage: Warum liest du einzelne Zeichen und nicht Blöcke in einen Puffer, bzw. die gesamte Datei auf einmal (wenn nicht zu groß)? Dann könntest du String-Such-Routinen benutzen und wärst flexibler, wenn sich die Suchworte mal ändern.

    P.S.: Mit if macht man Verzweigungen, keine Schleifen.



  • /* AOL Filter */

    #include <fstream>
    #include <iostream>

    using namespace std;

    int main()

    {
    ifstream aol ("AOL.txt", ios::beg);
    ofstream fertig ("AOL_bearbeitet.txt");

    // Speicher leeren

    cin.sync();
    cin.clear();

    // Status von AOL.txt

    if (!aol)
    {
    cout << "Fehler beim oeffnen von AOL.txt." << endl << "Die Datei AOL.txt muss sich im Verzeichnis des Programmes befinden." << endl;
    return 0;
    }

    else
    cout << "AOL.txt konnte geoeffnet werden." << endl;

    char scan[1];
    char letter;

    while (aol.eof())
    {
    Start:
    aol.read(scan, 1);
    //char letter = scan[0];

    if (scan[0] == 'h')
    {
    //cout << "H" << endl;
    aol.read(scan, 1);
    //letter = scan[0];

    if (scan[0] == 't')
    {
    //cout << "T" << endl;
    aol.read(scan, 1);
    //letter = scan[0];

    if (scan[0] == 't')
    {
    //cout << "T" << endl;
    aol.read(scan, 1);
    //letter = scan[0];

    if (scan[0] == 'p')
    {
    //cout << "P" << endl;
    int step = aol.tellg();
    cout << endl << "http gefunden bei Position ";
    cout << step << endl;
    fertig << "http";
    cout << "http";

    while (scan[0] != ' ')
    {
    aol.read(scan, 1);
    letter = scan[0];
    fertig << letter;
    cout << letter;
    }
    fertig << "\n";
    cout << endl;
    goto Start;
    //letter = scan[0];
    }
    }
    }
    }
    }

    cout << endl << "Das gesamte Dokument wurde durchsucht" << endl;

    return 0;
    }

    Das hatte ich erst vor, absatzweise einzulesen, aber es kam eine Fehlermeldung, wenn ich .find("TEXT") benutzen wollte.

    Der Text beinhaltet ca. 35500 Zeichen. Darunter sehr viele Leerzeichen.



  • RedHead0910 schrieb:

    Diese Zeichenauslese- Sache habe ich in eine FOR- Schleife gepackt mit der Bedingung :
    -!aol.eof()

    Da mit dieser Bedingung alleine die Schleife auf Mysteriöse weise zu einer Endlosschleife wird

    Du benutzt goto und dich wundert das?



  • Eine Anregung:

    char http[4] = {'h', 't', 't, 'p'};
    short blub = 0;
    char letter;
    bool bla;

    while(...)
    {
    if(letter = http[blub]) ++blub
    else blub = 0;
    if(blub = 4) cout << "Oh yeah!";
    }

    Würds schonmal einfacher machen, wobei ich nicht mit einzelnen Zeichen arbeiten würde....



  • Das GOTO springt ja nur an, wenn er ein http gefunden hat. Ansonsten wird die while schleife ja ganz normal durchlaufen und die bedingung !AOL.eof() wird dann geprüft.

    Zum einzelnen auslesen: Falls man beispielsweise immer 4 Zeichen durchsucht, kann ja folgendes passieren:

    13ht tp23

    was er ja dann nicht erkennen würde.



  • RedHead0910 schrieb:

    Das GOTO springt ja nur an, wenn er ein http gefunden hat.

    Ja ja, sowas passiert einem halt, wenn keine Code-Tags verwendet wurden. Fürs nächste mal also bitte diese verwenden, du siehst ja bestimmt selbst, dass der Code einfach unlesbar ist. Trotzdem ist das mit goto keine gute Lösung, denn wenn goto ausgeführt wird, wird aol.eof() am Schleifenanfang nicht geprüft, was ja trotzdem anschlagen kann und die Schleife somit verlassen würde.



  • Sorry erstmal wegen den Tags, hab den Code direkt aus der Datei mit Tags kopiert, wurden aber leider nicht übernommen.

    Das mit GOTO ist ja eigentlich nicht schlimm, da es im ernstfall, also wenn ein http die letzte Zeichenfolge war, nur einmal mehr Durchläuft. Aber mein Problem ist ja, das es garnichterst bis zum ende des Dokumentes durchläuft.



  • Sorry erstmal wegen den Tags, hab den Code direkt aus der Datei mit Tags kopiert, wurden aber leider nicht übernommen.

    Das mit GOTO ist ja eigentlich nicht schlimm, da es im ernstfall, also wenn ein http die letzte Zeichenfolge war, nur einmal mehr Durchläuft. Aber mein Problem ist ja, das es garnichterst bis zum ende des Dokumentes durchläuft.



  • mal 2 völlig überflüssige bemerkungen von mir:

    - 1x posten reicht in den meisten fällen aus..

    - mit [ cpp ] und [ /cpp ] (ohne leerschläge) kann man c++ code mit der syntaxhervorhebung verschönern..



  • Du hast recht, die waren ziemlich überflüssig.


Anmelden zum Antworten