Pliki tekstowe Do odczytu pliku tekstowego używać

Transkrypt

Pliki tekstowe Do odczytu pliku tekstowego używać
Pliki tekstowe
Do odczytu pliku tekstowego używać będziemy obiektu klasy StreamReader.
Odczyt pliku dyskowego polega na stowarzyszeniu/skojarzeniu tego pliku z obiektem klasy
StreamReader, a następnie czytaniu z tego obiektu.
Do czytania obiektu plikowego będziemy stosować trzy metody: ReadToEnd() – czyta całą
zawartość pliku; ReadLine() – czyta jedna linię z pliku; Read() – czyta pojedynczy znak z
pliku.
Aby polskie litery były dobrze odczytane trzeba ustawić kodowanie zgodne z aktualnym
kodowaniem znaków w Windows (System::Text::Encoding::Default). Jeśli plik jest zapisany
w innym kodowaniu np. ISO-8859-2, to kodowanie można ustawić za pomocą metody
GetEncoding() (System::Text::Encoding::GetEncoding(„ISO-8859-2”)).
W pracą z plikami warto zdefiniować sobie dwie przestrzenie nazw (namespace):
System::Text i System::IO.
Zad. 1.
Odczytaj zawartość pliku tekstowego (plik tekstowy należy utworzyć i wprowadzić do niego
dowolny tekst) i wyświetl ją w komponencie typu TextBox.
Pomocny kod
/utworzenie obiektu plikowego, skojarzenie go z plikiem F:\cplus.txt i ustawienie domyślnego
kodowania/
StreamReader^ plik = gcnew StreamReader("F:\cplus.txt", Encoding::Default);
/skopiowanie całej zawartości pliku do zmiennej/
String^ tekst;
tekst = plik->ReadToEnd();
/skopiowanie wartości zmiennej do komponentu typu TextBox/
textBox1->Text = tekst;
/zamknięcie pliku/
plik->Close();
Zad. 2.
Odczytaj zawartość pliku tekstowego (plik tekstowy utworzony w pierwszym zadaniu) i
wyświetl ją w komponencie typu TextBox. Plik należy odczytywać linia po linii.
Pomocny kod
String^ tekst;
StreamReader^ plik = gcnew StreamReader("F:\cplus.txt", Encoding::Default);
while (tekst = plik->ReadLine())
{
textBox1->AppendText(tekst + "\n");
}
plik->Close();
Zad. 3.
Odczytaj konkretną linię z pliku tekstowego (numer linii ma podać użytkownik w
komponencie typu TextBox, plik tekstowy utworzony w pierwszym zadaniu).
Pomocny kod
String^ tekst;
StreamReader^ plik = gcnew StreamReader("F:\cplus.txt", Encoding::Default);
Int16 i,j=1;
/wstawienie do zmiennej i przekonwertowanej na liczbę wartości podanej przez użytkownika/
i = Int16::Parse(textBox3->Text);
while (j<=i)
{
tekst = plik->ReadLine();
if (j == i) {
textBox2->Text = tekst;
}
j++;
}
plik->Close();
}
Zad. 4.
Odczytaj z pliku tekstowego liczby całkowite i oblicz a potem wyświetl ich sumę (plik
tekstowy należy utworzyć i wprowadzić do niego kilka liczb całkowitych oddzielonych
SPACJAMI). W kontrolce typu TextBox powinno być wyświetlone całe wykonane działanie,
np. dla odczytanych z pliku wartości 2, 34, 234, 5, 67 powinno być wyświetlone: 2 + 34 +
234 + 5 + 67 = 342
/należy pamiętać, że liczby zapisane w pliku testowym traktowane są tak samo jak każde inne
znaki – nie da się odczytać całej liczby, trzeba czytać znak po znaku i łączyć je w liczbę/
Pomocny kod
Char znak;
String^ sliczba;
Int16 liczba, wynik = 0;
StreamReader^ plik = gcnew StreamReader("F:\cplus1.txt",
Encoding::Default);
sliczba = "";
/metoda Peek() służy do „podglądania”, bez odczytu, kolejnego znaku w pliku, index znaku
końca pliku ma wartość -1, index dla spacji wynosi 32. /
while (plik->Peek() != -1)
{
while ((plik->Peek() != -1) && (plik->Peek() != 32))
{
/w pętli wewnętrznej budujemy liczbę, sklejając ją z kolejno odczytanych znaków do spacji/
znak = plik->Read();
sliczba += znak;
}
/konwersja liczby zapisanej jako string do wartości liczbowej /
liczba = Int16::Parse(sliczba);
if (wynik != 0) {
textBox1->Text += " + " + sliczba;
}
else {
textBox1->Text = sliczba;
}
/wynik powiększamy o kolejno odczytaną liczbę/
wynik += liczba;
sliczba = "";
plik->Read();
}
plik->Close();
textBox1->Text += " = " + wynik.ToString();
Do zapisu do pliku tekstowego używać będziemy obiektu klasy StreamWriter.
Korzystając z metod klasy StreamWriter możemy utworzyć nowy plik i do niego zapisać
wartości, albo dopisać wartości do istniejącego pliku.
Do zapisu elementów do pliku będziemy korzystać z dwóch metod: Write() – zapisuje
dowolny tekst do pliku; WriteLine() – zapisuje dowolny tekst do pliku zakończony znakiem
końca linii.
Zad. 5.
Utwórz plik tekstowy i zapisz w nim kilka elementów/wartości.
Pomocny kod
/utworzenie obiektu plikowego, skojarzenie go z plikiem F:\cplus2.txt i ustawienie
domyślnego kodowania,
Uwaga: drugi parametr konstruktora tworzącego obiekt klasy StreamWriter decyduje o tym,
czy plik ma być na nowo utworzony (wartość 0) czy ma być otwarty już istniejący plik i
dopisywanie do istniejącego (wartość 1) /
StreamWriter^ plik = gcnew StreamWriter("F:\cplus2.txt",0,
Encoding::Default);
plik->WriteLine("Cała linia");
plik->Write("Liczba całkowita: ");
Int16 liczba1 = 123;
plik->Write(liczba1.ToString());
plik->Write(" Liczba rzeczywista: ");
Double liczba2 = 43.56;
plik->Write(liczba2.ToString());
plik->Close();
Zad. 6.
Do pliku utworzonego w poprzednim zadaniu należy dopisać wartości/elementy podane przez
użytkownika.
Pomocny kod
StreamWriter^ plik = gcnew StreamWriter("F:\cplus2.txt", 1,
Encoding::Default);
plik->WriteLine();
plik->WriteLine(textBox1->Text);
plik->Close();