none
Punktdatei einlesen RRS feed

  • 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 5000

    Punktliste:

    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...

    Donnerstag, 27. Februar 2014 07:09

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
    Donnerstag, 27. Februar 2014 08:13

Alle Antworten

  • Hi,

    der Fehler liegt in deiner ForEach Schleife.

    Du initialisierst die Variable "i" bei jedem Durchlauf immer wieder mit 0.

    Donnerstag, 27. Februar 2014 07:51
  • Vielen Dank für die schnelle Antwort. Das ist mit Sicherheit auch ein Fehler, aber das Problem bleibt weiterhin bestehen.

    Wenn ich die Punktliste überwache wird sie direkt falsch gefüllt!

    Donnerstag, 27. Februar 2014 07:58
  • 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
    Donnerstag, 27. Februar 2014 08:13
  • 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
    Donnerstag, 27. Februar 2014 08:15
  • 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!
    Donnerstag, 27. Februar 2014 08:19