Frage zu Verhalten von getline in Kombination mit tellg und seekg



  • Hallo,

    ich habe folgende Textdatei:

    aaaa
    bbbb
    cccc
    12345678
    dddd
    eeee
    

    Jetzt wird folgendes ausgeführt:

    std::ifstream m_file;
    m_file.open("test.txt");
    std::string line;
    std::getline(m_file, line);
    std::getline(m_file, line);
    std::getline(m_file, line);
    

    die ersten 3 Zeilen werden also ausgelesen. Jetzt würde ich gerne eine Zeile weiter prüfen, was dort steht, und anschließend aber evtl. doch wieder von der aktuellen Position an fortfahren:

    int pos = m_file.tellg(); // Merke dir die aktuelle Position
    std::getline(m_file, line); // Naechste Zeile lesen und ausgeben
    cout<< "lookahead: "<<line<<endl; 
    m_file.seekg(pos); // Zeiger wieder zuruecksetzen
    

    Ich wuerde jetzt erwarten, dass ich nach erneutem std::getline die Zeile "12345678" erhalte.

    Das Verhalten ist aber merkwürdig. tellg() sagt mir nicht wie erwartet "Byte 13", sondern bereits bevor Zeile 4 gelesen wurde "Byte 20".
    Dann erst lese ich Zeile 4 und setze anschließend die Position auf "Byte 20", erhalte nach dem lesen aber "345678" 😕 .

    Verwende ich die Funktionen falsch? Wenn ich von der Position die Länge (Anzahl Bytes) der vorherigen Line abziehe, den Zeiger also gefühlt auf den Anfang von Zeile 4 setze, liefert der nächste std::getline-Aufruf nach:

    m_file.seekg(pos-4);
    

    nichts zurück 😕 Ich raff das gerade nicht 😕 😕



  • Ich hab per google diesen Thread gefunden:

    http://www.c-plusplus.net/forum/101283

    Ich verstehe das aber weiterhin nicht:

    std::ifstream m_file;
        m_file.open("test.txt");
        std::string line;
        std::getline(m_file, line);
        std::getline(m_file, line);
        std::getline(m_file, line);
    
        std::streampos pos = m_file.tellg();
        cout << line << endl;
        cout << pos << endl;
    
        // Eine Reihe lookahead
        cout << "--------------------------" << endl;
        std::getline(m_file, line);
        cout << "lookahead: " << line << endl;
        m_file.seekg(pos, std::ios::beg);
        cout << m_file.tellg() << endl;
    
        // Erwarte 12345678, erhalte aber 345678
        std::getline(m_file, line);
        cout << "danach : " << line << endl;
        return 0;
    

    Der Zeiger steht nach tellg genau da, wo er vorher war, aber beim auslesen fehlen Zeichen 😕



  • Okay, mit google folgendes gefunden:

    http://www.c-plusplus.net/forum/252092

    Man muss die Datei im Binärmodus öffnen, dann geht es auch:

    m_file.open("test.txt", ios::binary);
    

    Danke für's Lesen meiner Posts 😉


Anmelden zum Antworten