Pliki a tablice. Część 2
Materiał jest kontynuacją tematu Pliki a tablice. Część 1. W tej części przedstawię podejście do odczytu tablic z pliku przy założeniu, że w pliku jest zapisana jedna tablica, a pierwszy wiersz zawiera informację o rozmiarze tablicy (patrz poniższa ilustracja).
Zapis tablic do pliku z podaniem rozmiaru
Przyjmujemy, że pierwszy wiersz zawiera informację o rozmiarze tablicy. Tablicę jednowymiarową zapiszemy w jednym wierszu z separatorem spacji. Dla dwuwymiarowej podobnie. Poniżej odpowiednie kody funkcji
Wskazówka:
void ZapiszTabliceDoPlikuZRozmiarem(StreamWriter p, int[] t)
{
//przed danymi tablicy zapisz rozmiar tablicy jednowymiarowej
p.WriteLine(String.Format("{0} ", t.GetLength(0)));
int i = 0;
//zmienna p to strumień klasy plik
do
{
p.Write(String.Format("{0} ", t[i]));
i++;
} while (i < t.GetLength(0));
}
//przeciążenie powyższej funkcji
void ZapiszTabliceDoPlikuZRozmiarem(StreamWriter p, int[,] t)
{
//przed danymi tablicy zapisz rozmiar tablicy dwuwymiarowej
p.WriteLine(String.Format("{0} {1} ", t.GetLength(0), t.GetLength(1)));
int i = 0;
//zmienna p to strumień klasy plik
do
{
//zapamietaj jeden wiersz tablicy dwuwymiarowej
string s = "";
for (int j = 0; j < t.GetLength(1); j++)
s += String.Format("{0} ", t[i, j]);
//zapisz i przejdź do nowego wiersza
p.WriteLine(s);
i++;
} while (i < t.GetLength(0));
}
Poniżej przykładowe rozwiązanie zapisu jednowymiarowej tablicy w kolejnych liniach pliku. Przy tym podejściu nie trzeba używać znaku separatora. Pierwszy wiersz przechowuje informację o rozmiarze tablicy jednowymiarowej
Wskazówka:
//false- nadpisze plik jak istnieje
//true- dopisze do pliku jak istnieje
StreamWriter plik = new StreamWriter(saveFileDialog1.FileName, false);
//przed danymi tablicy zapisz rozmiar tablicy jednowymiarowej
plik.WriteLine(String.Format("{0}", tab1.GetLength(0)));
int i = 0;
do
{
plik.WriteLine(String.Format("{0}", tab1[i]));
i++;
} while (i < tab1.GetLength(0));
plik.Close();
Odczyt tablic z pliku z podanym rozmiarem
W każdym z odczytów danych musimy pamiętać o przyjętym sposobi zapisu danych w plikach. Pierwszy wiersz to rozmiar. Czy tablica zapisana jest w kolumnach czy w wierszach, czy jest jedna w pliku itp.
Metoda odczytu tablicy jednowymiarowej zapisanej w pliku jak poniżej
Przykładowy kod
Wskazówka:
//buduj tablice z odczytanych linii pliku tekstowego
StreamReader plik = new StreamReader(openFileDialog1.FileName);
//pierwsza linia to rozmiar tablicy
string roz = plik.ReadLine();
int n = Convert.ToInt32(roz);
tab1= new int[n];
string linia;
//czytaj plik dopóki linie nie są puste
while ((linia=plik.ReadLine()) != null)
{
string[] s = linia.Split(' ');
for(int j=0; j< tab1.GetLength(0); j++) tab1[j] = Convert.ToInt32(s[j]);
}
plik.Close();
Analogicznie dla tablicy dwuwymiarowej zapisanej w pliku tak jak pokazuje poniższa ilustracja.
Przykładowy kod
Wskazówka:
//buduj tablice z odczytanych linii pliku tekstowego
StreamReader plik = new StreamReader(openFileDialog1.FileName);
//pierwsza linia to rozmiar tablicy
string[] roz = plik.ReadLine().Split(' ');
int w = Convert.ToInt32(roz[0]);
int k = Convert.ToInt32(roz[1]);
tab2D = new int[w,k];
string linia;
int i = 0;
//czytaj plik dopóki linie nie są puste
while ((linia = plik.ReadLine()) != null)
{
string[] s = linia.Split(' ');
for (int j = 0; j < tab2D.GetLength(1); j++) tab2D[i,j] = Convert.ToInt32(s[j]);
i++;
}
plik.Close();
Zapis tablicy jednowymiarowej w pliku w układzie pojedynczej kolumny
Dla przykładu zapiszemy i odczytamy tablicę jednowymiarową w pliku w jednej kolumnie, w której pierwsza wartość to jej rozmiar.
Metoda zapisu
Wskazówka:
//false- nadpisze plik jak istnieje
//true- dopisze do pliku jak istnieje
StreamWriter plik = new StreamWriter(saveFileDialog1.FileName, false);
//przed danymi tablicy zapisz rozmiar tablicy jednowymiarowej
plik.WriteLine(String.Format("{0}", tab1.GetLength(0)));
int i = 0;
do
{
plik.WriteLine(String.Format("{0}", tab1[i]));
i++;
} while (i < tab1.GetLength(0));
plik.Close();
Metoda odczytu
Wskazówka:
//buduj tablice z odczytanych linii pliku tekstowego
StreamReader plik = new StreamReader(openFileDialog1.FileName);
//pierwsza linia to rozmiar tablicy
string roz = plik.ReadLine();
int n = Convert.ToInt32(roz);
tab1 = new int[n];
string linia;
int i = 0;
//czytaj plik dopóki linie nie są puste
while ((linia = plik.ReadLine()) != null)
{
tab1[i] = Convert.ToInt32(linia);
i++;
}
plik.Close();
Układ kontrolek
Projekt tej aplikacji jest rozwinięciem projektu z poprzedniego tematu. Proponowany układ kontrolek przedstawia poniższa ilustracja
Wszystkie przedstawione sposoby zapisu i odczytu plików z tablicami realizowane są przez wybór opcji z menu.