fstream - Problem



  • Momentan ist mein test - stream nur ein Pointer auf meinen
    f - stream. Wie kann ich zwei streams unabhängig voneinander
    durch eine Datei laufen lassen?

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    
     fstream f;
     fstream *p_test;
     p_test = &f;
    
     f.open("test.txt", ios::in);
    
     if(!f.is_open())
     cout << "Error" << endl;
    
    string s_test;
    string s_wort;
    
    while(!f.eof()){
    f >> s_wort;
    *p_test >> s_test;
    cout << s_wort << endl;
    cout << s_test << endl;
    }
    
    cin.sync();
    cin.get();
    return 0;
    }
    

    test.txt Inhalt:

    aaaa
    bbbb
    cccc
    dddd
    

    Ausgabe:

    aaaa
    bbbb
    cccc
    dddd
    

    erwünschte Ausgabe:

    aaaa
    aaaa
    bbbb
    bbbb
    cccc
    cccc
    dddd
    dddd
    


  • einfach indem Du zweimal lesend darauf zugreifst, jeweils mit einem ifstream - sähe so aus:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        ifstream f1("test.txt");
        ifstream f2("test.txt");  // ein zweites Mal zum Lesen öffnen
    
        if( !f1.is_open() || !f2.is_open() )
            cout << "Error" << endl;
    
        string s_test;
        string s_wort;
        while( (f1 >> s_wort) && (f2 >> s_test) ){
            cout << s_wort << endl;
            cout << s_test << endl;
        }
    
        cin.get();
        return 0;
    }
    

    Gruß
    Werner



  • vielen Dank für deine schnelle Hilfe 👍

    Gibt es denn auch eine Lösung bei der ich die
    Datei nicht zweimal öffnen muss? 🙂



  • Du könntest dir die jeweiligen Dateioffsets merken und immer hin- und herspringen. Da finde ich die Lösung mit zwei streams aber deutlich eleganter.



  • Na ja - kommt drauf an, was Du genau vor hast. Du kannst die Datei auch einmal öffnen und dann an zwei Stellen mit tellg() und seekg() den Lesezeiger verwalten - ist aber sicher umständlicher.

    Gruß
    Werner



  • Alternativ kannst du auch den kompletten Dateiinhalt in einen geeigneten Container stecken und darauf herumlaufen. Spart wiederkehrende, langsame Leseaufrufe auf der Datei. Kostet dafür etwas Speicher, aber wenn die Dateigröße nicht grade in die hunderte MB geht oder du im Normalfall nicht auf die ganze Datei zugreifst, ist das die komfortablere Methode.



  • ok danke noch mal an alle 🙂

    btw: @Werner
    dein Quellcode gefällt mir,
    muss ich mir mal eine Scheibe von abschneiden 😃


Anmelden zum Antworten