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 4Nach "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
-
In Zeile 15 liest du so lange ein, bis der
istreamungültig wird, also ein Fehler beim Lesen auftrat. Danach ist deristreamungültig und alle neuen Leseoperationen scheitern automatisch. Du musst zuerst den Fehlerstatus zurücksetzen mitstd::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?
-
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