Datei mit 'Sonderzeichen' auslesen



  • Hallo.

    Ich habe eine Frage zum Auslesen einer Datei, die in etwa so aussieht.

    //Referenzpunkte (nr,x,y,z):
    0 30 25 45
    1 ! 6 19
    2 ! 5 !
    3 35 29 20
    4 35 31 20
    5 20 35 17
    6 30 50 20
    7 15 29 45
    8 25 50 45

    Normalerweise nehme ich immer folgenden Code zum Auslesen:

    while (getline(datei,zeile)) 
    {
    		str.str(zeile);
    		count=0;			
    		while (str >> zahl)
    		{
    			data[count]=zahl;                    
    			count++; 
    		}
    		// ...mach was mit data
    }
    

    Das Problem ist nun aber, dass 'while (str >> zahl)' bei einem '!' abbrechen wird und daher der Rest der Zeile nicht mehr eingelesen wird. Daduch gehen mir Daten verloren. Wie kann ich das vermeiden? Das Ausrufezeichen steht im übrigen dafür, dass es für diese Koordinate keinen Wert gibt.

    Danke.
    H.W.



  • Klar, wenn der Stream etwas nicht lesen kann, bleibt er stehen und setzt das failbit. Aber darauf kannst du auch reagieren, indem du eine andere Einlese-Methode verwendest:

    while(count<4)
    {
      str>>zahl;
      if(!str)//keine Zahl erkannt
      {
        str.clear();
        if(str.get()=='!')
          zahl=-1;
        else
          break;
      }
      data[count++]=zahl;
    }
    


  • Okay. Danke. Dazu würde ich noch gerne wissen, ob es einen Unterschied gibt in dem Wert, den 'str' liefert, wenn es ans Ende einer Zeile oder an eine Nicht-Zahl trifft?

    Ich frage deshalb, weil ich

    while(count<4)
    

    gerne variabel machen möchte. Es gibt nämlich auch einige Zeilen, die mehr als 4 Werte enthalten.

    Danke.
    H.W.



  • Nein, in beiden Fällen ist das failbit gesetzt und str liefert NULL (bzw. !str liefert true). Aber am Zeilenende ist zusätzlich das eofbit gesetzt, das du mit str.eof() abfragen kannst.

    (bzw. in meinem obigen Code würde das get() fehlschlagen, wenn ich schon am Zeilenende stehe - und das beendet die Schleife per break)

    Edit: Das heißt in diesem Fall, du könntest die Abfrage auch so umgestalten:

    while(!(str>>zahl).eof())
      ...
    

Log in to reply