zahlen aus einem string lesen
-
Liest du die Antworten, die du bekommst? Das hat ja wohl überhaupt nicht mit dem zu tun, was dir gesagt wurde. Tatsächlich ist das Lesen sogar voller Fehler, kein Wunder, dass das nicht funktioniert. Erwartest du, dass jemand für dich deine Fehler in deinem Programm ausbessert?
-
Nein ich hatte den Code hier auch schon bevor ich den thread eröffnet habe.
Nur da mein Code nicht funktionierte wollte ich wissen wie man das vllt anders lösen könnte.
-
ok es funktioniert jetzt mit dem Code von seldon.
aber was macht der '>>' operator in diesem fall genau?
ich möchte das programm ja auch verstehen
-
darman96 schrieb:
- Also es handelt sich um .obj dateien.
damit ist die erste Frage eindeutig beantwortet. Das obj-Format von Wavefront ist bekannt.
darman96 schrieb:
- nach dem Einlesen möchte ich die in einer Struktur (VERTEX) speichern.
das ist nicht viel - aus Deinem Code kann ich folgern, dass VERTEX so aussieht:
struct VERTEX { double X, Y, Z; };
Wenn Du nur die vertices brauchst, so überlese alle Zeilen, die nicht mit einem v beginnen. Anschließend liest Du dann ein VERTEX ein und das macht man solange es keinen Lesefehler gibt - und den gibt es spätestens, wenn EOF erreicht wird.
#include <fstream> #include <limits> #include <iostream> #include <string> #include <vector> struct VERTEX { double X, Y, Z; }; // -- das ist die operator-Überladung für VERTEX // und hier werden die Zahlen getrennt (eingelesen) std::istream& operator>>( std::istream& in, VERTEX& v ) { return in >> v.X >> v.Y >> v.Z; } // -- überlese alles bis "v" am Zeilenanfang std::istream& skip_until_v( std::istream& in ) { for( std::string v; in >> v && v != "v"; ) in.ignore( std::numeric_limits< std::streamsize >::max(), '\n' ); return in; } std::vector< VERTEX > read_vertex( const char* filename ) { using namespace std; vector< VERTEX > vv; ifstream datei(filename); if( !datei.is_open() ) { cerr << "konnte Datei " << filename << " nicht oeffnen" << endl; return vector< VERTEX >(); } for( VERTEX vertex; datei >> skip_until_v >> vertex; ) vv.push_back( vertex ); return vv; } int main() { using namespace std; vector< VERTEX > vertices = read_vertex("wavefront.obj"); cout << "es wurden " << vertices.size() << " vertices gelesen" << endl; // ... die Koordinaten sind in der Struktur VERTEX gespeichert cin.get(); return 0; }
Das getrennte Einlesen der Zahlen in Zeile 16 funktioniert nicht anders als es Ethon bzw. seldon schon skizziert haben. Mehr dazu findest Du unter extraction operator des std::istream. Falls Du sonst noch Fragen zum Code hast, so stelle sie bitte.
Gruß
Werner
-
Der Ein-/Ausgabeoperator funktioniert grundsätzlich nicht bei Klassen,
da ein Objekt einer Klasse mehrere Eigenschaften haben kann.Z.B.
class student { public: string Alter; string Name; };
Wenn man nun ein Objekt der Klasse anlegt, z.B.: student s und versucht, mittels
cin>>s oder cin>>"50">>"Meyer" Daten einzugeben, funktioniert das logischerweise nicht, da der Compiler nicht weiß, ob nun das Alter oder der Name eingegeben werden soll.
Man kann dem Compiler durch eine Überladung von ">>" aber sagen, er soll bei einer Eingabe von cin>>"50">>"Meyer" das Alter mit 50 speichern und den Namen mit "Meyer".
-
@redrew99: Deine Begründung gefällt mir nicht. es liegt nicht da dran, dass der Kontext nicht eindeutig wäre. Es liegt da dran, dass schlichtweg keine solche Funktion existiert, wenn man sie nicht selber schreibt.
Die Operatoren kann man als ganz normale Funktionen auffassen, die optional mit einer etwas anderen Syntax aufgerufen werden können. Man kann nämlich auch
bar.operator>>(foo
) schreiben stattbar >> foo
und das ist äquivalent. Und der Knackpunkt hier ist, dass es schlicht keine Funktionoperator>>(std::istream&, student &)
gibt. Daher muss man die Funktion selber schreiben.
-
ok es funktioniert jetzt.
danke an alle für die Antworten.@Werner: danke auch für den link zum wiki eintrag von obj dateien jetzt weiß ich auch wo ich sehe welche vertices ich zu nem Face verbinden muss.
Gruß darman96
-
Dieser Beitrag wurde gelöscht!