positionierung mit tellg/seekg auslesen mit getline



  • hi,
    ich versuch mich gerade in c++ reinzuarbeiten.
    folgendes problem kapier ich einfach nicht:
    eine textdatei- zeilenweise ausgelesen - an einer stelle position merken - weiter auslesen - zurückspringen - trotzdem wird an einer anderen position weiter ausgelesen 😕

    #include <string>
    #include <fstream>
    #include <iostream>
    
    using namespace std;  
    
    int main(void)
    {
        ifstream fin("test.txt"); 
        streampos pos;
        string zeile;
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        pos = fin.tellg();
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        fin.seekg(pos);
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
    }
    


  • #include <string>
    #include <fstream>
    #include <iostream>
    
    using namespace std;  
    
    int main(void)
    {
        ifstream fin("test.txt");
        streampos pos;
        string zeile;
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        pos = fin.tellg();
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
    //   fin.seekg(pos);  <-  :warning: Alte Variante  :-1: 
    // hmm wie könnte das wohl richtig sein  :confused: 
    // :bulb: 
        fin.seekg(pos,std::ios::beg); 
    //:+1: :arrow_right: du musst die filepositionierung von vorne beginnen tellg() 
    // gibt immer den wert relative vom datei anfang zurück und ohne explizite 
    // angabe von std::ios::beg ist es halt 
    // std::ios::cur ( Current Position [ Aktuelle Position ] )
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
        getline(fin,zeile);
        cout << zeile << "\n";
    
    }
    


  • erstmal dickes dankeschön für die schnelle reaktion.
    aber leider ändert das am ergebnis nichts.
    zur verdeutlichung hier die ausgabe in der konsole die obiges programm sowohl mit als auch ohne deiner änderung erzeugt:

    test2
    REGION -24 38
    EINHEIT 1037590
    606826;Partei
    1;Anzahl
    ei
    1;Anzahl

    hier der dateiinhalt:

    test2
    REGION -24 38
    EINHEIT 1037590
    606826;Partei
    1;Anzahl
    EINHEIT 285258
    1040253;Partei
    9;Anzahl
    EINHEIT 25124
    1040253;Partei
    1;Anzahl
    EINHEIT 1037590
    606826;Partei
    1;Anzahl
    REGION -24 39

    der zeiger springt also schon zurück nur halt nicht genau richtig sondern nur in die nähe 🙂



  • Also ich weiß net was du hast, bei mir macht der code genau das was er soll:

    test2                 // 1. readline
    REGION -24 38         // 2. readline
    EINHEIT 1037590       // 3. readline
    // hier speicherste die position
    606826;Partei         // 4. readline
    1;Anzahl              // 5. readline
    // hier springste zurück 
    606826;Partei         // 6. readline
    1;Anzahl              // 7. readline
    


  • ich kapiers nicht
    ich hatte noch ein paar sachen probiert, unter anderem mit der textdatei rumprobiert:
    und folgendes bemerkt:
    für jede zeile die ich am ende lösche wird ein zeichen mehr ausgegeben:
    also statt
    ->ei
    ->artei
    wenn ich am ende der datei 3 zeilen lösche- wenn man das hochrechnet muss ich alle zeilen bis zum rücksprungpunkt löschen, dann wäre die zeile wieder komplett!
    also diese textdatei:

    test2
    REGION -24 38
    EINHEIT 1037590
    606826;Partei
    1;Anzahl
    EINHEIT 285258
    1040253;Partei
    9;Anzahl
    EINHEIT 25124
    1040253;Partei
    1;Anzahl
    EINHEIT 1037590

    führt zu dieser ausgabe:

    test2
    REGION -24 38
    EINHEIT 1037590
    606826;Partei
    1;Anzahl
    artei
    1;Anzahl



  • Beim Textmodus musst Du vorsichtig mit absoluter Positionierung sein. Unter Windos wird jedes Zeilenende in 2 Zeichen umgewandelt '\r\n'. Unter Linux ist es nur ein Zeichen. Beim Einlesen mit getline fallen die Zeilenendezeichen wieder weg. Im Binärmodus erfolgt diese automatische Umwandlung nicht. Beim Positionieren mit seekg wird aber jedes Zeichen gezählt.

    DJohn
    EDIT: Rechtschreibung



  • hmm, ok ich kann verstehen das beim einlesen mit getline der dateizeiger anders gezählt wird als beim späteren neupositionieren. was ich aber nicht verstehe ist warum sich die resultierende position dadurch ändert das am ende der datei zeilen dazukommen oder gelöscht werden, da diese ja überhaupt nichts damoit zu tun haben(dachte ich).

    und dann natürlich die frage:
    was für mechanismen gib es denn dann zur sicheren positionierung des dateizeigers im textmodus?

    der Gilb


Anmelden zum Antworten