Benutzer mit den meisten Antworten
Punktdatei einlesen

Frage
-
Hallo liebe Community,
ich komme gerade nicht weiter bzw. finde den Fehler nicht. Ich will einfach nur eine Punktdatei einlesen. Diese hat 5 Spalten Punktnummer, -art und 3 Koordinaten. Ich gehe wie folgt vor:
private void Btn_Input_Click(object sender, EventArgs e) { string Dateiname = TB_Input.Text; //Dateiname aus Textfeld auslesen string Zeile; using (StreamReader reader = new StreamReader(Dateiname)) { while ((Zeile = reader.ReadLine()) != null) { string[] split; split = Zeile.Split(); Point.Pktnr = split[0]; Point.Pktart = split[1]; Point.RW = Convert.ToDouble(split[2]); Point.HW = Convert.ToDouble(split[3]); Point.H = Convert.ToDouble(split[4]); Punktliste.Add(Point); } } Punktliste_zeigen(); //Methode Punktliste zeichnen aufrufen }
Die Punktliste ist eine Liste vom Typ Punkt. Die Methode Punktliste_zeigen() sieht wie folgt aus:
private void Punktliste_zeigen() { foreach(Punkt item in Punktliste) { int i = 0; Punkt temppoint = (Punkt)Punktliste[i]; LB_Output.Items.Add(temppoint.Pktnr); //Ausgabe in Listbox i++; }
So weit so gut. Leider ist das Ergebnis falsch. Die Punktliste hat die richtige Anzahl von Punkten. Aber in der steht i-mal der letzte Punkt, also zum Beispiel:
Punktdatei:
1 2 3 4 5
10 20 30 40 50
100 200 300 400 500
1000 2000 3000 4000 5000Punktliste:
1000 2000 3000 4000 5000
1000 2000 3000 4000 5000
1000 2000 3000 4000 5000
1000 2000 3000 4000 5000
Wo ist der Fehler?
Vielen Dank im voraus...
Antworten
-
Hi,
jetzt sehe ich das Problem.
Point.Pktnr = split[0]; Point.Pktart = split[1]; Point.RW = Convert.ToDouble(split[2]); Point.HW = Convert.ToDouble(split[3]); Point.H = Convert.ToDouble(split[4]); Punktliste.Add(Point);
Du fügst bei jedem Reader.ReadLine() Durchlauf immer wieder die selbe Referenz auf "Point" der Punktliste hinzu!!!
Eigentlich müsstest du bei jedem Durchlauf eine neue Point Instanz erzeugen, stattdessen hast du jetzt eine Punktliste, bei der alle Elemente auf das selbe Point Objekt zeigen und das hat den Inhalt des letzten ReadLine() Durchlaufs.
- Als Antwort markiert Oliwood15 Donnerstag, 27. Februar 2014 08:17
Alle Antworten
-
Hi,
jetzt sehe ich das Problem.
Point.Pktnr = split[0]; Point.Pktart = split[1]; Point.RW = Convert.ToDouble(split[2]); Point.HW = Convert.ToDouble(split[3]); Point.H = Convert.ToDouble(split[4]); Punktliste.Add(Point);
Du fügst bei jedem Reader.ReadLine() Durchlauf immer wieder die selbe Referenz auf "Point" der Punktliste hinzu!!!
Eigentlich müsstest du bei jedem Durchlauf eine neue Point Instanz erzeugen, stattdessen hast du jetzt eine Punktliste, bei der alle Elemente auf das selbe Point Objekt zeigen und das hat den Inhalt des letzten ReadLine() Durchlaufs.
- Als Antwort markiert Oliwood15 Donnerstag, 27. Februar 2014 08:17
-
das Problem ist das die Variable in der Foreach Schleife deklariert wird, dadurch erreicht i nie über 1...
Eleganter ist es wenn du eine for Schleife nimmst oder die int i oberhalb der schleife deklarierst.
Beispiel:
for(int i=0; i<Punktliste.Count; i++) { }
Was er da macht sollte schnell ersichtlich sein er geht von i=0 los und geht bis i<Punktlise.Count (Count gibt die Anzahl der Elemente der Liste wieder) und inkremmentiert nach jedem Schritt den Zähler.
Ein Casten nach Punkt ist nicht nötig, das weiss er aus der Liste sowieso...
Für das Problem beim füllen der Liste müsstest du die Definition von Punkt posten.
Als Tipp schaue dir doch mal den Syntax von Split an. http://www.dotnetperls.com/split
- Bearbeitet Brian Dahl Donnerstag, 27. Februar 2014 08:23
-
DA IST DER FEHLER! :)
So funktioniert es:
private void Btn_Input_Click(object sender, EventArgs e) { string Dateiname = TB_Input.Text; //Dateiname aus Textfeld auslesen string Zeile; using (StreamReader reader = new StreamReader(Dateiname)) { while ((Zeile = reader.ReadLine()) != null) { Punkt Point = new Punkt(); //neunen Point vom Objekt Punkt anlegen string[] split; split = Zeile.Split(); Point.Pktnr = split[0]; Point.Pktart = split[1]; Point.RW = Convert.ToDouble(split[2]); Point.HW = Convert.ToDouble(split[3]); Point.H = Convert.ToDouble(split[4]); Punktliste.Add(Point); } } Punktliste_zeigen(); //Methode Punktliste zeichnen aufrufen }
Vielen Dank, Holger!