INF.04 · C# · lekcja 9
Praca z plikami (TXT i JSON)
Zapisz dane, zamknij program, odczytaj
- Zrozum
- Sprawdź
- Napisz sam
Po tej lekcji: zapisz dane, zamknij program, odczytaj
Dzisiaj zrobisz konkretną rzecz
To domknięcie działu fundamentów — bez zapisu do pliku każdy program "zapomina" wszystko po zamknięciu. Format JSON, którego się tutaj nauczysz, wykorzystasz jeszcze wielokrotnie: w aplikacjach mobilnych .NET MAUI (zapis danych lokalnie) i w komunikacji z serwerami webowymi.
Gdy gra komputerowa zapamiętuje Twój postęp między sesjami, w tle najczęściej zapisuje go właśnie jako plik JSON — strukturę danych (poziom, punkty, ekwipunek) łatwą do odczytania z powrotem przy następnym uruchomieniu.
Sprawdź w działaniu
Zapisz dane, zamknij program, odczytaj
Najpierw przewidź wynik. Zmień dane w modelu i porównaj efekt. Spróbuj także przypadku granicznego, a nie tylko pierwszego poprawnego przykładu.
Model pokazuje wybraną zasadę. Nie uruchamia ani nie ocenia wklejonego kodu C#.
1. Przygotuj i uruchom własny projekt
2. Najpierw mały przykład
Wykonaj tę próbę przed dłuższym rozwiązaniem. Serialize zamienia strukturę danych na napis JSON. WriteAllText zapisuje go do pliku i zastępuje wcześniejszą treść. Deserialize<string[]> odtwarza tablicę napisów; typ musi odpowiadać strukturze pliku. Ścieżka próbna jest w katalogu tymczasowym.
using System.Text.Json;
string sciezka = Path.Combine(Path.GetTempPath(), "bitedu-cs-proba.json");
string json = JsonSerializer.Serialize(new[] { "Ola", "Jan" });
File.WriteAllText(sciezka, json);
string[] imiona = JsonSerializer.Deserialize<string[]>(File.ReadAllText(sciezka)) ?? [];
Console.WriteLine(string.Join(", ", imiona));
Ola, Jan. Plik próbny pozostaje w katalogu tymczasowym; możesz go potem usunąć.
- Co sprawdzić? Zmień jedną wartość i przed uruchomieniem zapisz przewidywany rezultat. Porównaj go z opisem wyniku; przy błędzie wróć do konkretnej instrukcji.
Jak to działa — 1
Dane w zmiennych, tablicach i kolekcjach znikają, gdy program się kończy — żeby dane PRZETRWAŁY zamknięcie programu, trzeba je zapisać na dysku, w pliku. Klasy do pracy z plikami w C# znajdują się w przestrzeni nazw System.IO.
Zapisywanie tekstu do pliku:
File.WriteAllText("dane.txt", "Treść pliku"); — nadpisuje CAŁĄ zawartość pliku (tworzy plik, jeśli nie istnieje).
Odczytywanie tekstu z pliku:
string tresc = File.ReadAllText("dane.txt");
Dopisywanie do pliku (bez nadpisywania istniejącej zawartości):
File.AppendAllText("dane.txt", "Nowa linian");
Praca linia po linii — przydatna, gdy plik zawiera listę rekordów, jeden na linię:
string[] linie = File.ReadAllLines("dane.txt"); zwraca tablicę, gdzie każdy element to jedna linia pliku.
Pliki JSON — format do zapisywania danych STRUKTURALNYCH (nie tylko czystego tekstu), np. całych obiektów czy list. C# udostępnia do tego bibliotekę System.Text.Json:
Serializacja (zamiana obiektu/listy C# na tekst JSON do zapisania): string json = JsonSerializer.Serialize(lista);
Deserializacja (odczytanie tekstu JSON z powrotem jako obiekt/listę C#): List<string> lista = JsonSerializer.Deserialize<List<string>>(json);
JSON jest szczególnie ważny, bo dokładnie w tym formacie będziesz zapisywać dane w aplikacjach mobilnych .NET MAUI i wymieniać dane z serwerami webowymi.
3. Pełny przykład — czytaj od Main
Teraz zastąp Program.cs tym programem. Zanim uruchomisz, znajdź dane wejściowe, operację i miejsce prezentacji wyniku. W tym wariancie zachowujemy jawny Main. Nie wklejaj kilku pełnych programów do jednego pliku.
using System;
using System.IO;
using System.Collections.Generic;
using System.Text.Json;
class Program
{
static void Main()
{
// zapis zwykłego tekstu
File.WriteAllText("powitanie.txt", "Witaj w pliku tekstowym!");
string odczytany = File.ReadAllText("powitanie.txt");
Console.WriteLine("Z pliku: " + odczytany);
// zapis listy jako JSON
List<string> ulubioneFilmy = new List<string> { "Podróż w czasie", "Ostatni bastion" };
string json = JsonSerializer.Serialize(ulubioneFilmy);
File.WriteAllText("filmy.json", json);
Console.WriteLine("Zapisano JSON: " + json);
// odczyt listy z JSON
string odczytanyJson = File.ReadAllText("filmy.json");
List<string> wczytaneFilmy = JsonSerializer.Deserialize<List<string>>(odczytanyJson);
foreach (string film in wczytaneFilmy)
{
Console.WriteLine("Wczytany film: " + film);
}
}
}
- Prześledź kod
JsonSerializer.Serialize(ulubioneFilmy)zamienia listę C# na tekst w formacie JSON (np.["Podróż w czasie","Ostatni bastion"]) gotowy do zapisania w pliku.JsonSerializer.Deserialize<List<string>>(...)robi operację odwrotną — z tekstu JSON odtwarza prawdziwą listę C#, na której możesz od razu pracować (np. pętląforeach).
Sprawdź, zanim przepiszesz cały program
Częsty błąd to użycie File.WriteAllText() zamiast File.AppendAllText(), gdy celem jest DOPISANIE danych — WriteAllText zawsze nadpisuje całą dotychczasową zawartość pliku. Drugi błąd: próba odczytu pliku, który jeszcze nie istnieje — zgłosi wyjątek FileNotFoundException (Lekcja 16). Trzeci: próba deserializacji JSON do niewłaściwego typu (np. List<string>, gdy plik zawiera Dictionary) — zgłosi błąd w trakcie działania programu.
Ćwiczenie z pomocą · samodzielna praca
4. Teraz Twoja zmiana
Zapisz do pliku tekstowego swoje imię i nazwisko, a następnie odczytaj i wypisz zawartość tego pliku.
Spełnij warunki polecenia. Zapisz wejście, otrzymany wynik i wyjaśnij, która część kodu za niego odpowiada.
? Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź
Wróć do podstawowej formy oraz objaśnienia: Serialize zamienia strukturę danych na napis JSON. WriteAllText zapisuje go do pliku i zastępuje wcześniejszą treść. Deserialize<string[]> odtwarza tablicę napisów; typ musi odpowiadać strukturze pliku. Ścieżka próbna jest w katalogu tymczasowym.
Krok 2 — pokaż podpowiedź
Zmień tylko część potrzebną do polecenia. Zachowaj działającą wersję przed zmianą i uruchamiaj po każdym małym etapie.
Krok 3 — pokaż podpowiedź
Sprawdź przypadek zwykły i graniczny; porównaj z regułą: Ola, Jan. Plik próbny pozostaje w katalogu tymczasowym; możesz go potem usunąć.
Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.
5. Sprawdź rozumienie, nie tylko uruchomienie
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →