ifstream problem



  • Bitte bevor ihr mich auf die Suche schickt oder in dokus
    nur ein ganz kleines Problem:
    Ich habe eine txt-datei:
    X-Position: 35
    Y-Position: 20
    Breite: 30
    Hoehe: 10
    Zeichen: #

    und ich möchte jede zeile lesen und die werte die nach dem : stehen in variablen einlesen, mein programm liest mir den ersten wert richtig ein aber die anderen vier nicht, ich glaube das er bei mir nur eine zeile liest und nicht zeile für zeile
    schaut es euch kurz an:

    void Rechteck::einlesen()
    {
            ifstream dat;
            dat.open("eingabe.txt",ios::in);
            string varname;
            while(!dat.eof())
            {
                    getline(dat,varname,':');
    
                    if(varname=="X-Position")
                            dat>>xachse;
                    else if(varname=="Y-Position")
                            dat>>yachse;
                    else if(varname=="Breite")
                            dat>>breite;
                    else if(varname=="Hoehe")
                            dat>>hoehe;
                    else if(varname=="Zeichen")
                            dat>>symbol;
            }
    
            dat.close();
    
    }
    


  • Geh mal mit dem Debugger durch und schau nach was in varname drin steht. Ich vermute einfach mal, dass das EOL von der Zeile davor noch mit drin ist und du somit keine Gleichheit hast.
    Arbeite hier besser mit find. Weiterhin solltest du nicht auf eof prüfen. Du kannst getline gleich mit in die if-bedingung packen.



  • getline liest stehts alle Zeichen von der aktuellen Leseposition bis zum angegebenen Delimiter (hier ':'). Damit wird bei der zweiten Zeile auch das newline-Zeichen der ersten Zeile und ggf. einige Leerzeichen hinter der Zahl mit in die Variablen 'varname' übernommen.
    Also beim zweiten Mal ist varname == "\nY-Position" und dies ist ungleich zu "Y-Position".

    Mir fallen spontan zwei Lösungsmöglichkeiten ein:
    1.) lese statt getline den String direkt ein - also ändere die Zeile 8 in:

    dat >> varname;
    

    und berücksichtige beim anschließenden Vergleich den ':' im String.
    Die Voraussetzung dass dies funktioniert ist mindestens ein Leerzeichen zwischen dem ':' und dem was folgt und weiter dürfen die Variablennamen nicht durch Leerzeichen unterbrochen sein. Beides wäre bei Deinem Beispiel erfüllt.

    2.) Überlese vorher die Leer- bzw. Whitespace-Zeichen - also ändere die Zeile 8 in:

    getline( dat >> ws, varname,':');
    

    Noch eine Bemerkung zum Endekriterium der Schleife. Wenn Du nur auf eof() prüfst, so kann dies im Fehlerfall (z.B. Zahl kann nicht gelesen werden) zu einer Endlosloop führen. Außerdem muss nach der letzten Zahl kein EOF gesetzt sein, weil z.B. noch ein newline-Zeichen folgt.

    Abhilfe besteht darin, den Zustand des Streams auf !fail abzufragen.
    Also entweder:

    while( dat >> varname )
            {
                    if(varname== ...
    

    oder

    while( getline( dat >> ws, varname,':') )
            {
                    if(varname== ...
    

    Gruß
    Werner



  • vielen dank ich habs jetzt!!!!!!!!!! 😉 🙂 😉


Log in to reply