Problem mit getline() in Schleife [gelöst]



  • Hallo Miteinander!

    Wahrscheinlich stehe ich gerade ziemlich auf dem Schlauch ...
    aber gerade macht mein getline Befehl in einer Schleife nicht das, was er soll.

    Vereinfacht schaut der Code so aus:

    string s1, s2;
    int i = 0; 
    
    ifstream txtFile(path);
    if (txtFile.good()) {
        while (!txtFile.eof() && i < 12) {
        getline(txtFile, s1);
        getline(txtFile, s2);
        i++;
        }
    }
    

    Statt der while könnte ich natürlich auch eine for-Schleife nehmen. In beiden Fällen werden allerdings nur die beiden ersten Zeilen eingelesen, obwohl die Schleife 11 mal durchlaufen wird. Es soll allerdings die 11. und 12. Zeile eingelesen werden.
    Was stimmt denn da nicht ? 😕

    Für jede Hilfe bin ich dankbar!

    Liebe Grüße
    Deepling



  • ifstream txtFile(path);
    for(int i = 0; txtFile && i < 10; ++i)
        txtFile.ignore(std::numeric_limits<std::streamsize>::max, '\n');
    
    getline(txtFile, s1);
    getline(txtFile, s2);
    

    Probiers doch so.



  • oder so (einfach Dein Code nachgebildet, tut aber nicht, was Du laut Deiner Beschreibung eigentlich erreichen willst)...

    std::string s1;
    std::string s2;
    int i = 0;
    std::ifstream(path);
    while(std::getline(txtFile, s1) && std::getline(txtFile, s2) && (i < 12))
    {
    	//...
    	++i;
    }
    


  • Deepling schrieb:

    Statt der while könnte ich natürlich auch eine for-Schleife nehmen. In beiden Fällen werden allerdings nur die beiden ersten Zeilen eingelesen, obwohl die Schleife 11 mal durchlaufen wird. Es soll allerdings die 11. und 12. Zeile eingelesen werden.
    Was stimmt denn da nicht ? 😕

    Dadurch, dass du in jeder Iteration zwei Zeilen einliest, sollte in s1 und s2 nachher die 23. und 24. Zeile stehen.



  • Michael E. schrieb:

    Deepling schrieb:

    Statt der while könnte ich natürlich auch eine for-Schleife nehmen. In beiden Fällen werden allerdings nur die beiden ersten Zeilen eingelesen, obwohl die Schleife 11 mal durchlaufen wird. Es soll allerdings die 11. und 12. Zeile eingelesen werden.
    Was stimmt denn da nicht ? 😕

    Dadurch, dass du in jeder Iteration zwei Zeilen einliest, sollte in s1 und s2 nachher die 23. und 24. Zeile stehen.

    Hups!
    Stimmt natürlich. 😃

    Eigentlich will ich nur nicht explizit eine bestimmte Zeile. Sondern ich suche nach einer Zeile, die eine bestimmte Zahl enthält. Obwohl es diese Zeile gibt, liest getline immer die ersten beiden Zeilen ein ...



  • Deepling schrieb:

    Eigentlich will ich nur nicht explizit eine bestimmte Zeile. Sondern ich suche nach einer Zeile, die eine bestimmte Zahl enthält.

    Dann solltest du uns den entsprechenden Code mal zeigen, da ich in obigem Code keinen weiteren Fehler sehe.



  • Hallo Michael,

    danke schon mal für Deine Hilfe!
    Danke auch den Verfassern der anderen Antworten ...

    GetValueFromFile (float look){
    [...]
    
    AnsiString valueAnsStr;
    string line, path;
    float value;
    int testint = 0;
    
    ifstream txtFile(path);
    if (txtFile.good()) {
    	while (value <= look  && !txtFile.eof()) {
    	    testint++;
                getline(txtFile, line);
                valueAnsStr = line.c_str();
                valueAnsStr = Trim(valueAnsStr);
                if (TryStrToFloat(valueAnsStr,value)==true){
                    value = StrToFloat(valueStr);
                }
            }
    }
    [...]
    return value;
    }
    

    Ziel der Funktion ist es den ersten Wert in einer Textdatei zu finden, der größer ist als der an die Funktion übergebene Wert "look". In der Textdatei befinden sich aufsteigende Zahlen (1, 3, 7, ... ) bis zu einem Wert von 300.

    Mit dem testint überprüfe ich, wie oft die Schleife durchlaufen wurde. Egal wie oft dies der Fall ist - immer wird der Wert ("value"), der in der ersten Zeile der Textdatei steht, zurückgegeben. Ganz egal, ob ich für 'look' 50 oder 100 oder sonstwas eingebe ...

    Führe ich getline() zwei Mal aus bekomme ich bei der Ausführung für einen zweiten Wert value2 den Wert der zweiten Zeile...

    Liebe Grüße
    Deepling



  • if (TryStrToFloat(valueAnsStr,value)==true){
                    value = StrToFloat(valueStr);
    

    Da value bereits in der ersten Zeile der zuletzt eingelesene Wert zugewiesen wird, ist die zweite Zeile überflüssig. Ich weiß auf Anhieb auch nicht, was da schief läuft. Hab auch noch nie mit der VCL gearbeitet (musste sogar nachschauen, dass das da VCL ist). Aber wenn du doch floats aus der Datei einlesen willst, warum machst du nicht genau das?

    float GetValueFromFile (float look){
        float value;
        ifstream txtFile(path);
        while(txtFile >> value && value <= look);
        return value;
    }
    


  • Hallo Michael,

    vielen Dank für die nette Antwort :).
    Wenn das VCL ist, dann bin ich ja im falschen Forum ... ups ;)!

    Der Grund wieso ich es nicht direkt als float einlese ist folgender. Um es vereinfacht darzustellen hab ich nur die halbe Wahrheit erzählt:
    In den einzelnen Zeilen steht eine Zahl, dann ein Trennzeichen und dann kommt eine weitere Zahl. Der eingelesene String wird mit einer Split-Funktion am Trennzeichen in einen Vektor zerlegt.

    Das bedeutet, der value-Wert, der größer als der look-Wert ist, wird gesucht. Gleichzeitig ist der value Wert an einen weiteren Wert gekoppelt, den ich auch auslesen möchte.

    Das mit dem Auslesen funktioniert auch. Aber nur halt für die erste oder ersten beiden Zeilen ...
    Vielleicht klappt's ja trotzdem, wie Du sagst. Werd's morgen mal ausprobieren und Rückmeldung geben.

    Danke für den Hinweis mit dem TryStrToFloat ;).

    Liebe Grüße



  • Das ist ja immer noch ein einfaches Dateiformat. Du kannst Folgendes machen:

    float key, value;
    while(txtFile >> key >> value && key <= look);
    


  • Hallo Michael,

    hab ganz vergessen, Feedback zu geben. Sorry!
    Hat super geklappt!

    Vielen Dank für die Hilfe!!

    Liebe Grüße
    Deepling


Anmelden zum Antworten