echt kompliziertes Problem, wie bekomme ich nen Doublefeld in 3 verschied. Variablen?
-
Nabend,
ich habe hier ein Problem und komme einfach nicht weiter. Vielleicht ist auch nur irgendwo ein kleiner Denkfehler aber ich sehe das Mistding nicht.
Ich habe hier ein Programm, welches mir meine Daten in eine selbstdefinierte Struktur schreibt. Die Struktur sieht folgendermaßen aus:
struct vektor { double x; double y; double z; string zeile; double temp; }; vektor *daten = new vektor[1000];Das Programm macht nichts anderes, als dass es eine Textdatei zeilenweise einliest, in bei jeder Zeile von einer gewissen Stelle an eine Zahl als double speichert. Die Datei ist aber so dumm aufgebaut, dass in der 1. Zeile der x-Wert, in der 2. Zeile der y-Wert und in der 3. Zeile der z-Wert steht. Dann wiederholt sich das ganze bis zum Schluss.
Schrott, x-Wert, Schrott
Schrott, y-Wert, Schrott
Schrott, z-Wert, Schrott
Schrott, x-Wert, Schrott
Schrott, y-Wert, Schrott
Schrott, z-Wert, SchrottDen Schrott habe ich mittels der folgenden Methode bereits entfernt und bin so an die double Zahlen gekommen:
double zahl_kopieren(string zeile) { string temp=""; // temporärer String int position=0; // Anfangsposition double rueckgabe=0.0; // Rueckgabewert // nehme die Zeile, suche nach dem ersten Komma und erstelle dann einen // neuen temporären String ab dieser Position position = zeile.find_first_of(','); temp = zeile.substr(position+1,zeile.length()); // nehme den temporären String, suche nach dem erstem Komma und erstelle dann // einen neuen temporären String bis zu dieser Position position = temp.find_first_of(','); temp = temp.substr(0,position); // die so gewonnene Zahl wandle in ein Double um rueckgabe=atof(temp.c_str()); return rueckgabe; }Nun durch diese Methode bekomme ich jetzt aus jeder Zeile die Zahl, nur wie schreibe ich jetzt die Zahlen nacheinander in die Struktur? Komme da echt nicht weiter. Habe die Zahlen erstmal vorrübergehend in daten[].temp reingespeichert um zu sehen ob das Parsen klappt. Klappt alles wunderbar.
Nur wie komme ich da jetzt weiter? Bräuchte irgendwie ne Schleife die durch die Struktur geht und bei jedem 2. Durchlauf daten[].y füllt, bei jedem 3. Durchlauf daten[].z füllt und ansonsten daten[].x füllt!
Geht das nicht eleganter, durch nen Stream oder so?
Danke schonmal für die Mühe die ich euch mache, aber ich bin mit meinem Latein komplett am Ende.
cya chicken

-
für die es interessiert, hier habe ich das Hauptprogramm:
// Hauptprogramm int main(int argc, char* argv[]) { /* -------------------------------------------------------------------- */ string name = "DATENPCDIMS_neu"; // Dateiname der Istwertdatei string endung = "txt"; // Dateiendung /* -------------------------------------------------------------------- */ // Hilfsvariablen festlegen (werden vom Programm automatisch gefüllt) string input = name + "." + endung; fstream datei; // Dateipointer int zeilen=0; // Anzahl der Zeilen der Tabelle /* -------------------------------------------------------------------- */ // Behandlung der Eingabe-Datei /* -------------------------------------------------------------------- */ // mein Datenvektor, Datei darf maximal 1000 Zeilen haben vektor *daten = new vektor[1000]; // Datei zum Lesen öffnen datei.open(input.c_str(), ios::in); // Solange wie das Dateiende noch nicht erreicht ist while (!datei.eof()) { // hole dir die aktuelle Zeile getline(datei, daten[zeilen].zeile); // behandle die Zeile und kopiere die Zahl raus daten[zeilen].temp=zahl_kopieren(daten[zeilen].zeile); // Kontrollausgabe cout << fixed << setprecision (6) << daten[zeilen].temp << endl; // zähle die Zeilen zeilen++; } datei.close(); return 0; }
-
statt find_first_of() würde ich find() nehmen, da kannst du angeben, ab wo du sichen willst. also etwa:
pos1 = zeile.find(',', 0); pos2 = zeile.find(',', pos1); return atof(zeile.substr(pos1,pos2).c_str());bzw. statt der letzten Zeilen ginge auch
stringstream tss; tss << zeile.substr(pos1,pos2); tss >> result; return result;PS: wäre evtl nicht schlecht, wenn du statt einfacher Code-tags die cpp-tags benutzt, das macht das Ganze deutlich übersichtlicher...
-
chickenwing schrieb:
Nur wie komme ich da jetzt weiter? Bräuchte irgendwie ne Schleife die durch die Struktur geht und bei jedem 2. Durchlauf daten[].y füllt, bei jedem 3. Durchlauf daten[].z füllt und ansonsten daten[].x füllt!
Geht das nicht eleganter, durch nen Stream oder so?
double read_double( istream &i ) { //... hier eine zeile einlesen und den double-wert extrahieren etc... return the_one_and_only_double; } daten_einlesen( /*hier ein paar parameter..*/ ) { ifstream f("deine datei"); int i = 0; while( !f.eof() ) //<= da bin ich nicht sicher ;) { daten[i].x = read_double( f ); daten[i].y = read_double( f ); daten[i].z = read_double( f ); } //und aufpassen, dass daten[] auch groß genug ist... }meinst du sowas?

-
ja genau so etwas in der Art suche ich.
Ich hatte so etwas Ähnliches schonmal, da standen die x,y,z Werte einfach untereinander.
da habe ich dann einfach mittels
while (!datei.eof()) { datei >> daten[i].x >> daten[i].y >> daten[i].z }die Daten eingelesen und als er bei der z Koordinate angekommen ist hat er einfach wieder vorne bei x angefangen. Ist eigentlich sehr komfortabel gewesen.
Ich werde diese while Schleife mal ausprobieren und melde mich dann wieder.
Bis dahin schonmal fettes Mercy...
@pumuckl
Wieso brauchst du für meine 30 Zeilen Code nur 3 Zeilen.
Ich muss noch viel lernen...cya chickenwing

-
Jo danke euch beiden. Habs grad getestet und ja es funktioniert.
Jipi
