Schleifenproblem



  • #include "class.h"
    
    int verwaltung::CreatIndex(){
    
        int i = 0;
    
        fstream f_files1;
        f_files1.open( "files1.txt", fstream::in );
    
        fstream f_files2;
        f_files2.open( "files2.txt", fstream::in );
    
        fstream f_index;
        f_index.open( "Index.txt", fstream::out );
    
        string s_vergleich1;
        string s_vergleich2;
    
        while ( !f_files1.eof() ){
    
         getline( f_files1, s_vergleich1 );
    
         while ( !f_files2.eof() ){
    
         getline( f_files2, s_vergleich2 );
    
            if ( ( i = s_vergleich2.compare(s_vergleich1) ) == 0 ){
            f_index << s_vergleich1 << endl;
            }
        }
        f_files2.seekg ( 0, ios_base::beg );
        }
    
        f_files1.close();
        f_files2.close();
        f_index.close();
    
     return 0;
    }
    

    files1:

    a.txt
    b.txt
    c.txt
    d.txt
    e.txt
    f.txt
    g.txt
    h.txt
    i.txt
    j.txt
    k.txt
    l.txt
    m.txt
    n.txt
    o.txt
    p.txt
    z.txt
    

    files2:

    a.txt
    b.txt
    c.txt
    d.txt
    e.txt
    f.txt
    g.txt
    h.txt
    i.txt
    j.txt
    k.txt
    l.txt
    m.txt
    n.txt
    z.txt
    

    index:

    a.txt
    

    Warum wird nach dem 1. Vergleich des 1. String in files1
    mit dem 1. String des files2 kein weiterer Vergleich mehr gemacht?

    Meine Vermutung war, dass der f_files2 stream nach einmaligem Durchlaufen der
    2. while schleife am Ende angelangt ist...
    jedoch müsste dieser nach f_files2.seekg ( 0, ios_base::beg );
    wieder am Anfang stehen.

    Wäre nett wenn mir jemand helfen könnte 🙂



  • Kurzer Nachtrag:
    die Zeile 28 heißt,

    if ( s_vergleich2.compare(s_vergleich1) == 0 ){
    

  • Mod

    Du hast recht mit deiner Vermutung, aber dein seekg steht hinter der Schleife die die erste Datei durchläuft.

    Zu deinem Code:
    Hat i irgendeinen Sinn? warum vergleichst du die Strings nicht mit "=="?

    Wenn du vor einer Leseoperation auf eof prüfst, bringt dir das herzlich wenig, wenn die folgende Leseoperation wegen eof scheitert und du dann trotzdem mit der Verarbeitung weitermachst. Schreib deine Schleifenköpfe lieber so: while ( getline( f_files1, s_vergleich1 ) )

    Gibt es Gründe, warum du die Dateien von Hand öffnest und schließt? Das kannst du doch den Konstruktor und Destruktor des fstreams automatisch machen lassen. Dann kann garantiert nichts schiefgehen, während ein versehentlich falsch eingesetztes open oder close zu merkwürdigem Verhalten führt.

    Warum benutzt du fstream und nicht ifstream/ofstream?



  • SeppJ schrieb:

    Du hast recht mit deiner Vermutung, aber dein seekg steht hinter der Schleife die die erste Datei durchläuft.

    Das steht doch in der 1. while Schleife,
    also nach der Schleife, die die 2. Datei durchläuft,
    oder verstehe ich dich falsch? 🙂


  • Mod

    O.o schrieb:

    SeppJ schrieb:

    Du hast recht mit deiner Vermutung, aber dein seekg steht hinter der Schleife die die erste Datei durchläuft.

    Das steht doch in der 1. while Schleife,
    also nach der Schleife, die die 2. Datei durchläuft,
    oder verstehe ich dich falsch? 🙂

    Oh ,richtig. Deine Einrückung hat mich total durcheinandergebracht. Ich gucke mir das mal an. Ich habe oben noch ein paar Fragen/Anmerkungen an dich reineditiert, mit denen du dich inzwischen beschäftigen kannst.


  • Mod

    Ich hab's: Nachdem das getline von Datei 2 am Dateiende fehlschlägt, ist der Stream in einem Fehlerzustand. Den musst du ersteinmal beseitigen mit clear(), bevor du wieder etwas mit dem Stream machen kannst.



  • SeppJ schrieb:

    Ich habe oben noch ein paar Fragen/Anmerkungen an dich reineditiert, mit denen du dich inzwischen beschäftigen kannst.

    Ok 🙂

    -hat i irgendeinen Sinn?
    i hatte noch einen Sinn, als ich mit .find() anstatt .compare
    verglichen habe. Dies hat allerdings zu Problemen im Programmablauf geführt.

    -Gibt es Gründe, warum du die Dateien von Hand öffnest und schließt?
    Der f_index.close() gehört eigentlich in eine
    andere funktion und da habe ich es lieber, wenn ich sehe wo ich eine
    File schließe^^

    -Schleifenköfpe
    cool wusste ich nicht :p



  • SeppJ schrieb:

    Ich hab's: Nachdem das getline von Datei 2 am Dateiende fehlschlägt, ist der Stream in einem Fehlerzustand. Den musst du ersteinmal beseitigen mit clear(), bevor du wieder etwas mit dem Stream machen kannst.

    Echt super, vielen Dank!!! 😃



  • mh aber mal so ne andere anmerkung_

    wieso liest du die dateien nicht komplett ein(z.B. in nem std::vectorstd::string) und guckst dir dann diese gespeicherten daten an

    so ist das doch mordslangsam weils immer auf die festplatte warten muss


Anmelden zum Antworten