Zapis i odczyt danych z plików

0

Dopiero zaczynam zabawe z programowaniem i moja wiedza jest dosc skąpa wiec postanowiłem skorzystac z pomocy bardziej doswiadczonych programistó :)

Chce napisac program który bedzie wykonywał obliczenia róznych rzeczy w Układzie Współrzędnych (zaymuty, odległosci, konty miedzy dwoma prostymi itp. itd.).
Program juz liczy owe odległosci i azymuty ale mam problem ze stworzeniem bazy punktów dla tego programu.

Potrzebuje aby program zapisywał numer punktów, spółrzędne X i Y a nastepnie je odczytywał.

Jak na razie mój program umie zapisac i odczytac pojedyńczy punkt i nie wiem jak zrobic aby miec mozliwosc stworzenia wiekszej ich liczby i miec dostep w karzdej chwili do wymaganego punktu i odpowiedniej jego spółrzędnej X lub Y.

To co "stworzyłem" wyglada tak:

// ZAPIS DANYCH

            //zmienne
            string nKatoalog;
            string nrPunktu;
            int xPunktu;
            int yPunktu;
            FileStream punktyZ;

            //pobieram dane od uzytkownika
            Console.WriteLine("Podaj dane do pliku.");

            Console.WriteLine(@"Podaj nazwę Roboty");
            nKatoalog = Console.ReadLine();

            Console.WriteLine("Podaj nr punktu:");
            nrPunktu = Console.ReadLine();

            Console.WriteLine("Podaj X punktu:");
            xPunktu = int.Parse(Console.ReadLine());

            Console.WriteLine("Podaj Y punktu:");
            yPunktu = int.Parse(Console.ReadLine());

            // tworze folder pliku
            Directory.CreateDirectory(@"E:\Programowanie\exp\" + nKatoalog + @"\");

            //tworze obiekt typu FileStream
            punktyZ = new FileStream(@"E:\Programowanie\exp\" + nKatoalog + @"\" + nrPunktu + @".txt", FileMode.OpenOrCreate);
            //tworze strumien typu StreamWriter
            StreamWriter swX = new StreamWriter(punktyZ);
            swX.Write(nrPunktu + " " + xPunktu + " " + yPunktu);  //zapisuje lancuch tekstu do pliku
            swX.Close();         //zamykamy zapis
            punktyZ.Close();

// O D C Z Y T   D A N Y C H

            //zmienne
            System.Console.WriteLine("Podaj nazwe roboty: ");
            string Katoalog = System.Console.ReadLine();

            System.Console.WriteLine("Podaj numer punktu: ");
            string nrPunktu = System.Console.ReadLine();
            string nP;      // numer punktu
            string xP;      // X punktu
            string yP;      // Y punktu
            FileStream file;

            file = new FileStream(@"E:\Programowanie\exp\" + Katoalog + @"\" + nrPunktu + @".txt", FileMode.OpenOrCreate, FileAccess.Read);
            StreamReader sr = new StreamReader(file);
            string s = sr.ReadToEnd();
            sr.Close();
            file.Close();
            
            string[] s_podzielone = s.Split(new char[] {' '});
            foreach (string str in s_podzielone)
                nP = s_podzielone[0];
                xP = s_podzielone[1];
                yP = s_podzielone[2];

            System.Console.WriteLine("nr Punktu: " + nP);
            System.Console.WriteLine("X Punktu: " + xP);
            System.Console.WriteLine("Y Punktu: " + yP);
            System.Console.ReadLine();

Nie wiem jeszcze dlaczego program wypisuje komunikat:  " Use of unassigned local varible 'nP'" i podkresla nP w 4 linijce od konca  :-/
0

Wywal foreach na końcu.

0

Dzieki :) błedu juz nie ma :)

Ale nadal nie wiem jak rozwiazac problem z bazą punktów :/

0

Zapisuj wspolrzedne jednego punktu w jednej linijce, albo np.
X1,Y1;X2,Y2;...;Xn,Yn
Potem podziel to splitem, wrzuć do tablicy string[] albo jakiegoś Hashtable z numerami punktów jako klczami i czytaj ;)

0

Nad linijkami własnei mysle ale problem polega na tym ze nie wiem jak odczytywac z róznych linijek :/ na przykłąd bede miał 20 punktów i bede chciał odczytac X punktu 13 :/ i nie wiem jak to wykonac :/

A co do przydzielania X1, Y1, X2, Y2, to musze Od razu odreslic ile bede miał tych punktów i strace mozliwosc dodawania ich w miare potrzeb :/

Jesli jednak da sie to zrobic którys z tych sposobów prosił bym o napisanie jak to zrobic [???]

0

Czy dobrze widzę że nie masz klamerek przy foreach?? ;)

0

a po co mu klamerki tam?

0

Tutaj masz kod : (pisałem na szybko)

public sealed class PointList : List<Point>
    {
        public void SavePoints(string filepath)
        {
            using (StreamWriter writer = File.AppendText(filepath))
            {
                foreach (Point p in this)
                {
                    writer.Write(p.X + "," + p.Y + ";");
                }
            }
        }

        public void LoadPoints(string filepath)
        {
            string pointsstr = File.ReadAllText(filepath);
            string[] points = pointsstr.Split(';');
            foreach (string p in points)
            {
                if(p != string.Empty)
                {
                    string[] pt = p.Split(',');
                    int X = Convert.ToInt32(pt[0]);
                    int Y = Convert.ToInt32(pt[1]);
                    this.Add(new Point(X, Y));
                }
            }
        }

Przykładowe wykorzystanie:

PointList PL = new PointList();
PL.Add(new Point(3, 2));
PL.Add(new Point(5, 1));
PL.Add(new Point(11, 6));
PL.SavePoints("Points.txt");
PL2 = new PointList();
PL2.LoadPoints("Points.txt");
MessageBox.Show("Point drugi: " + PL2[1].ToString());

Skumaj tylko sam schemat rozwiązania. Polecałbym zrobienie ogólnej klasy bazującej na interfejsie IPoint, wtedy moglbys liczyc też punkty 3D lub inne wielowymiarowe (np. kazdy obiekt implementujący interfejs IPoint moglby miec metode ToString ktora zwraca wszystkie swoje wspolrzedne po przecinku).
Pozdrawiam.

0

Dziki bardzo :) dzisiaj juz jestem zmeczony ale jutro wezme sie za to :) przeanalizuje co i jak i zabieram sie do pisania :)

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