Problem mit ifstream: tellg(), seekg(), getline



  • Hi,

    Ich habe ein kleines Problem und ich denke, dass es mit einem kleinen Beispiel am besten zu erläutern ist:

    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    
    using namespace std;
    
    int main()
    {
        vector<fstream::pos_type> v;
        string s;
    
        ifstream ifs("c:\\test.txt", ios::binary);
        if(ifs)
        {
            v.push_back(ifs.tellg());
            while(getline(ifs, s))
            {
                v.push_back(ifs.tellg());
                cout << s << endl;
            }
            ifs.clear();
    
            cout << endl;
            for(unsigned int i = 0; i < v.size(); ++i)
            {
                ifs.seekg(v[i]);
                getline(ifs, s);
                cout << s << endl;
            }
            ifs.close();
        }
        else
            cerr << "err" << endl;
    
        return 0;
    }
    

    Ich weiss, der Code macht keinen Sinn, aber wieso wird hier IMMER, egal welche Datei ich verwende, die letzte Zeile doppelt ausgegeben?

    //Noch 3 Fragen
    Wieso funktioniert tellg() hier nur, wenn die Datei im Modus ios::binary geöffnet wird?
    Wozu benötigt man das ifs.clear(), ein Fehler tritt dort ja nicht auf?
    Ist fstream::pos_type hier der richtige Datentyp?

    😕

    Compiler: GNU GCC (IDE: Code::Blocks)


  • Administrator

    anonym16 schrieb:

    Ich weiss, der Code macht keinen Sinn, aber wieso wird hier IMMER, egal welche Datei ich verwende, die letzte Zeile doppelt ausgegeben?

    Weil du zuviele Positionen speicherst. Die letzte Position, welche du speicherst, liegt gleich vor dem Ende des Files. In deiner For-Schleife wird nun dieser Wert gesetzt und probiert eine weitere Zeile zu lesen. Dies scheitert allerdings und in s steht immer noch die gleiche Zeile.

    anonym16 schrieb:

    Wieso funktioniert tellg() hier nur, wenn die Datei im Modus ios::binary geöffnet wird?

    Das würde mich sehr überraschen. Bist du sicher mit dieser Behauptung? Wenn ja, Kompiler?

    anonym16 schrieb:

    Wozu benötigt man das ifs.clear(), ein Fehler tritt dort ja nicht auf?

    Doch. Das Ende vom Stream wird erreicht, wodurch das eofbit gesetzt wird, was ein Fehler ist.

    anonym16 schrieb:

    Ist fstream::pos_type hier der richtige Datentyp?

    Ja.

    Grüssli



  • Danke, für dir Antworten. Das Problem mit den doppelten Zeilen habe ich nun gelöst. 🙂

    Doch das Problem mit dem ios::binary besteht weiterhin.
    Ich habe eine ganz einfache Testdatei test.txt, die 4 Wörter enthält.
    Wenn ich das ios::binary wegnehme, wird nur die erste und die letzte Zeile ausgegeben.


Anmelden zum Antworten