Objekt aus Datei einlesen
-
Hallo liebe Programmierer,
ich habe da ein kleines Problem, welches ich gerne mit euch lösen würde. Leider haben meine eigenen Anstrengungen und suchen in Bibliotheken, sowie Internet nichts gebracht, da dachte ich es wäre gut sich über dieses Forum weiterhelfen zu lassen. Ich zähle auf euch!

So jetzt will ich mal nicht länger "rumlabern", es geht um folgendes, ich habe eine Klasse Turm erstellt, welcher auf einer x-y-Fläche aufgestellt werden soll. Es gibt n-Türme. Die Anzahl, sowie die Daten xpos und ypos sollen aus einer Datei eingelesen werden. Des Weiter soll auch die Anzahl der Türme aus der Datei ausgelesen werden. Also am Ende sollen dann beispielsweise 3 Türme mit den jeweiligen x- und y-Koordinaten im Programm zur weiteren Verarbeitung stehen. Ich hoffe ich konnte einigermasen erklären was ich will, ansonsten einfach fragen.
So sieht die Klasse aus
class Turm
{public:
int xpos;
int ypos;
}Danke schonmal!!
-
Das nennt man Serialisierung.
Grob gesagt überladt man dazu den operator>> und den operator<<. Dann programmiert man eben die funktionen so, dass sie aus einem streamobjekt die daten lesen können und sie auch reinschreiben können.
Grobe Skizze:operator>> ( std::ofstream& stream ) { stream << val1 << val2; } operator<< ( std::ofstream& stream ) { stream >> val1; stream >> val2; }So ganz grob.. hab den operator selten überladen bin mir grade nicht sicher, aber so sollte es gehen.
rya.
-
Danke schonmal für den schnellen Tip, leider habe ich sowas auch schon gefunden, bin aber leider (da ich auch nicht so wirklich von diesem Gebiet bin) dadurch nicht viel weiter gekommen. Kannst du mir noch mehr darüber erzählen?
Danke
-
Bin selbst recht unerfahren, aber habe letzt was ähnliches programmiert.
Das sah ungefähr so aus, wenn du einen Vector aus Objekten deiner Klasse verwendest.
Ich weiss allerdings auch nicht, wie die Datei genau aussieht, in der die Werte für xpos und ypos stehen.
std::vector<Turm> towers; int i=0; ifstream in(filename); while(!in.eof()){ in >> x >> y; towers[i].push_back(x); towers[i].push_back(y); ++i; } int number_towers = towers.size();
-
Hey alx, erst mal danke.
Ja gut die Datei würde ich dann einfach anpassen. Kann ich das so machen das sie Türme sozusagen dynamisch erzeugt werden, also nicht festgelegt, sondern soviel erzeugt werden wie in der datei angegeben sind.
Bsp. für Datei:
4Türme
Turm1
xpos=100;
ypos=200;
Turm2..
...
-
Das ganze funktioniert sowieso für beliebige Anzahlen von Türmen. Durch "while(!in.eof()) geht man ja einfach durch die Datei, bis sie zu Ende ist.
Der Code, den ich geschrieben habe, funktioniert natürlich nur für Dateien, die etwa so aussehen:
5 8
3 9
2 6
....Es darf also nichts außer den Werten für xpos und ypos drin stehen, da der Code einfach nach und nach Zahlen ausliest.
Wenn du noch solche Sachen "xpos Turm1=" und so in der Datei hast, wird es komplizierter. Wie man dann genau an die Werte kommt, die man haben will, weiss ich auch nicht.
-
alx3400 schrieb:
Wenn du noch solche Sachen "xpos Turm1=" und so in der Datei hast, wird es komplizierter. Wie man dann genau an die Werte kommt, die man haben will, weiss ich auch nicht.
Da könnte man einfach mal das erste Wort einlesen und dann intern vergleichen, welches Attribut es sein soll und dann den '=' skippen und den Wert einlesen und dem Attribut zuordnen. Wenn man ein paar Sachen definiert, wie man etwas beschreiben muss, geht das recht einfach.
-
Was eine (nicht hervorragende) Lösung wäre:
std::ifstream file("Test.txt", std::ios::in); while(!file.eof()) { std::string line; std::getline(file, line); if(line.find("Turm")) ReadTurm(line); } void ReadTurm(const std::string &line) { size_t posTurm = line.find("Turm"); if(std::string::npos != posTurm) { // Read in turm number } std::string nline; std::getline(file, nline); ReadTurmData(nline); }Mit grundlegenden Kentnissen sollte es nun ein Klacks sein, den Rest zu proggen.