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.

Ta interakcja wymaga włączonego JavaScriptu.

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.

Program.cscsharp
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));
Wynik
Ola, Jan. Plik próbny pozostaje w katalogu tymczasowym; możesz go potem usunąć.
  1. 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.

Program.cs — osobne uruchomieniecsharp
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);
        }
    }
}
  1. 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.

Oczekiwany rezultat
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ę →
Źródła i dalsza nauka