Datei einlesen



  • Hallo!

    Ich möchte eine Datei einlesen, und zwar sieht so eine Datei wie folt aus:

    # vtk DataFile Version 3.0
    Somebody's face
    ASCII
    DATASET POLYDATA
    POINTS 6 float
    0 -0.2048 -0.090616 0 -0.204 -0.090824 0 -0.2032 -0.09104
    0 -0.2024 -0.091256 0 -0.2016 -0.091464 0 -0.223 -0.121
    POLYGONS 4 16
    3 0 3 4
    3 0 1 2
    3 1 4 5
    3 1 2 6
    3 2 3 4

    Nach "Points" kommt die Anzahl der Punkte, deren Koordinaten vom Typ "float" sind (sind sie aber immer). Jeder Punkt besteht aus x,y,z Koordinate.
    Nach "POLYGONS" folgt die Anzahl der Polygone und dann die Größe der "Zellliste", was auch immer das genau sein soll. Ich glaube das ist einfach AnzahlPolygone * 4.

    So, ich möchte jetzt die Punkte in ein Array float Punkte [anzahl][3] speichern und die Polygone in meinetwegen in ein Array int polygone [groesse_zellliste].

    Dafür habe ich folgenden Code geschrieben:

    ifstream input("../data/test.vtk");
    	string just_read = " ";
    	int number_of_points;
    	float x,y,z;			//the coordinates of one point
    	int number_of_polygons;
    	int size_of_cell_list;
    
    	if(!input) cerr << "File not found!" << endl;
    	while(just_read.compare("POINTS") != 0) input >> just_read;   //read until we read "POINTS"
    	input >> number_of_points;			     	      //this is now the number of points in the file
    
    	//we now save all the points (x,y,z) into an multidim array
    	float vertices[number_of_points][3];
    	for(int index = 0; input >> x >> y >> z; ++index) {   // <-- this terminates when next z is no float
     		vertices[index][0] = x;
    		vertices[index][1] = y;
    		vertices[index][2] = z;
    	}
    
    	input >> just_read;
    	cout << just_read << endl;
    	input >> just_read;
    	cout << just_read << endl;
    	while(1);
    

    Irgendwie scheine ich diesen "<<" bzw ">>" Operator nicht ganz zu kapieren.
    Die Punkte werden alle korrekt eingelsen, allerdings ist "just_read" in Zeile 21 und 23 jeweils das gleiche, nämlich "POINTS".
    Das verstehe ich nicht...schiebt ">>" nicht irgendwie einen Pointer weiter?

    Dankesehr!

    Wimme


  • Administrator

    In Zeile 15 liest du so lange ein, bis der istream ungültig wird, also ein Fehler beim Lesen auftrat. Danach ist der istream ungültig und alle neuen Leseoperationen scheitern automatisch. Du musst zuerst den Fehlerstatus zurücksetzen mit std::istream::clear .

    Grüssli



  • ui, danke für die schnelle Antwort.

    Ja, das klappt.
    Wann wird die Eingabe denn ungültig? Wenn das erste mal ein "Nicht-Float" gelesen wird?


  • Administrator

    Wimme schrieb:

    Wann wird die Eingabe denn ungültig? Wenn das erste mal ein "Nicht-Float" gelesen wird?

    Genau. Das ist eine falsche Eingabe, wodurch der Stream ungültig wird.

    Grüssli


Anmelden zum Antworten