własny StreamReader

0

witam wszystkich,

Raczej jestem początkującym programistą wiec problem przed którym który mnie zatrzymał może się dla niektórych wydawać banalny.

Do rzeczy - chcę stworzyć własna bibliotekę zajmującą się odczytywaniem plików LAS ( ASCII ) opieram się gółwnie na StreamReader

Moj Reader :

 

    public class LasReader : IDisposable

    {

        private static string path = null;

        public static string Path
        {
            get { return path; }
            set { path = value; }
        }


        public LasReader()
        {
            path = null;
        }

        public LasReader(string inPath)
        {
            path = inPath;
        }

        public string ReadLine()
        {
            

            if (path == null)
                return null;

            if (File.Exists(path))
            {

                StreamReader sr = new StreamReader(path, System.Text.Encoding.Default, true);
                
                    string line;

                    while ((line = sr.ReadLine()) != null)
                    {
                        //line = line.Trim();
                        //line.Replace(",", ".");

                        return line;
                    }
                    return null;
                    sr.Close();
                }
            
            return null;
        }

        public void Dispose()
        {
            Dispose();
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }
}

problem w tym iż w przykładowym wywołaniu

 


	using (LasReader lsr = new LasReader(asciiFilePath))
            {
                string singleLine;
                uint lineCounter = 0;
                sPoint tempPoint;

                while ((singleLine = lsr.ReadLine()) != null)
                {

                    if (singleLine.Length == 0)
                        continue;

                    var linetemp = singleLine.Split(" ".ToCharArray());

			// dalsze przetwarzanie danych
		}
	}

to co otrzymuje to zawsze pierwsza linia tego pliku - nawet mnie to nie dziwi. Zapewne za każdym razem odpalana jest nowa instancja klasy i plik czytany jest od początku. Problem w tym ze nie wiem jak to rozwiązać . to co chciałbym otrzymać na wyjściu to linia po linii którą mógłbym na bieŻąco (Boże, widzisz takie błędy i nie grzmisz) konwertować do int-a i dalej przetwarzać.

jeśli to będzie pomocne można założyć ze każda linia posiada taką samą liczbę zmiennych.

1

No sprawa jest raczej oczywista - każde wywołanie twojej metody ReadLine powoduje nową instancję StreamReader i czytanie pierwszej linii. Tutaj nie dziedziczyłeś wcale po StreamReader (jeśli ta nie jest oznaczona jako sealed to można).

Jednym ze sposobów jest przeniesienie instancji StreamReader do pola twojej klasy, i dalej używanie go w metodzie (której oczywiście należy zmodyfikować, aby czytała dalej, a nie tylko raz).

Kilka uwag:

public class LasReader : IDisposable

W twoim przypadku dziedziczenie po tym interfejsie nic nie daje, a nawet psuje. Polecam artykuł który opisuje IDisposable (znajdziesz w serwisie). Dopiero gdy StreamReader będzie u ciebie jako pole - możesz użyć IDisposable - ale kod Dispose() i tak trzeba zmodyfikować.

private static string path = null;

Nie sadze abyś chciał używać do tego elementów statycznych klasy. Radzę usunąć "static" jak najszybciej dla tego pola - jeśli nie, to będziesz miał znacznie utrudnione korzystanie z kilku instancji tej klasy, każdy z innym Path.

      public LasReader()
        {
            path = null;
        }

        public LasReader(string inPath)
        {
            path = inPath;
        }

Zamień na:

public LasReader(): this(null){
}

        public LasReader(string inPath)
        {
            path = inPath;
        }
 if (path == null)
   return null;

Chyba lepiej będzie wyrzucić wyjątek w tym przypadku.

                StreamReader sr = new StreamReader(path, System.Text.Encoding.Default, true);
               
                    string line;

                    while ((line = sr.ReadLine()) != null)
                    {
                        //line = line.Trim();
                        //line.Replace(",", ".");

                        return line;
                    }
                    return null;
                    sr.Close();
                }
           

IDisposable once again...

0

interface IDisposable wykorzystałem tylko po to aby później można było wykorzystać LasReader w using() , bardzo nie wnikałem w skuteczność tego rozwiązania.

Deti napisał(a)

Jednym ze sposobów jest przeniesienie instancji StreamReader do pola twojej klasy, i dalej używanie go w metodzie (której oczywiście należy zmodyfikować, aby czytała dalej, a nie tylko raz).

Czy dobrze cię rozumiem ? zainicjować StreamReadera w programie a następnie jako parametr klasy przesłać do LasReadera i tam wykorzystać przy ReadLine() ?

1

Czy dobrze cię rozumiem ? zainicjować StreamReadera w programie a następnie jako parametr klasy przesłać do LasReadera i tam wykorzystać przy ReadLine() ?

Nie, klient twojej klasy ma nawet nie wiedzieć o istnieniu StreamReadera w twojej klasie. Miałem na myśli to, aby instancja StreamReadera została zachowana jako pole w twojej klasie - dzięki czemu będziesz sobie czytał kolejne linie dzięki właśnie StreamReader'owi.

0

Sukces ! Dziekuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1