Nachfolgende Zeile nach iterator umsetzung mit getline einlesen



  • i, Ich habe folgende datei:

    111
    111
    111
    ||test
    222
    222
    222
    59
    ||lol
    333
    333
    333
    56
    6

    Ich ermittel wieviele Zeichen es bis zu dem ||lol sind indem ich das in einem string einfüge und dann mit find arbeite.
    So erhalte ich die Zahl 34. Nun möchte ich gerne die nächste zeile mithilfe von getline auslesen. Dafür setze ich den iterator auf 43+6 wegen den 6 zeichen von ||lol +'\n' . Therotesch hört sich das ja gut an aber wenn ich jetzt mit getline weiter auslesen will fängt der nicht da on wo er soll in der nächsten zeile sondern ganz woanders. Ich muss + 13 rechnen damit das einwantfrei klappt.
    Das wäre ja nicht das prob aber sobald ich ||test mit ||lol vertausche klappt das nichtmehr und der fängt zuweit unten an.

    Meine frage ist jetzt wieso?
    Und gibt es eine lösung?

    Mfg. Matyr

    Hier nochmal den source code:

    char test[]={"||lol\n"};
    
    		int pos=s_Datei.find(test,0);
    
    		cout<<"--:  "<<pos<<"\n";
    
    		pos=pos+(sizeof(test)*2)+1;
    		cout<<"--:  "<<ab<<"\n";
    		Datei.seekg(pos);
    
    		getline(this->Datei,tmp);
    		cout<<"A: "<<tmp<<"\n";
    		convert(tmp,this->Daten.a);
    
    		if(Daten.a<=0){Daten.a=2;}
    
    		getline(this->Datei,tmp);
    		cout<<"B: "<<tmp<<"\n";
    		convert(tmp,this->Daten.b);
    
    		if(Daten.b<=0){Daten.b=2;}
    
    		getline(this->Datei,tmp);
    		cout<<"C: "<<tmp<<"\n";
    		convert(tmp,this->Daten.c);
    
    		if(Daten.c<=0){Daten.c=2;}
    
    		getline(this->Datei,tmp);
    		cout<<"GG: "<<tmp<<"\n";
    		convert(tmp,this->Daten.gg);
    
    		if(Daten.gg<=0){Daten.gg=2;}
    


  • Beschreibe mal, was das Programm machen soll, und nicht, was das Programm macht.



  • Ich habe in einer Datei mehrere Daten pakete welche jeweils über eine überschrift verfügen welche ich suchen möchte. Anschließend soll alles unter der Überschrift Zeilenweise eingelesen und verarbeitet werden. Die größe der Datenpakete variert nur die eigentliche Überschrift bleibt konstant.



  • Sowas vielleicht?

    typedef std::vector<std::string> LineVec;
    
    LineVec readAfterTitle(const std::string& title, std::ifstream& reader)
    {
        LineVec lines;
        std::string currentLine;
        bool titleFound = false;
    
        while(std::getline(reader, currentLine))
        {
            if(titleFound)
            {
                lines.push_back(currentLine);
            }
            if(currentLine.find(title) != std::string::npos)
            {
                titleFound = true;
            }
        }
    
        return lines;
    }
    
    //Aufruf:
    //LineVec lines = readAfterTitle("Title", stream);
    //Liest alle Zeilen, die nach Title im File sind in lines ein
    


  • so würde das gehen. aber mich interessiere auchr woran das liegt das das mit meiner methode nicht klappt.



  • das wird sich allein schon wegen der einrückungen niemand angucken ^^
    außerdem kannst du so was auch gleich im C-Forum posten...

    const char test[] ("||lol\r\n");
    
    int pos = s_Datei.find (test, 0); //von was für nem Typ ist s_Datei?
    
    cout << "--:  " << pos << endl;
    
    //wie kommst du darauf?: pos += 2*sizeof(test) + 1;
    pos += strlen (test);
    
    cout << "--:  " << ab <<endl;
    Datei.seekg (pos); //toll, dass du erst eine Funktion nimmst, die den Zeiger ohnehin schon hier hingerückt haben sollte und das dann noch mal machst
    
    getline (this->Datei, tmp); //was ist tmp?
    cout << "A: " << tmp << endl;
    convert (tmp, this->Daten.a);
    
    if (Daten.a <= 0)
       Daten.a = 2;
    

    usw... so kann man das ganze auch schon etwas lesen - auch wenns immernoch eher nach C-style aussieht

    bb


Anmelden zum Antworten