Dataniedziela, 9 sierpnia 2026 Czas07:16:40
← Programowanie konsolowe (C#)

Lekcja 9. Praca z plikami (TXT i JSON)

Trudny / egzaminacyjny

Po co się tego uczymy?

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.

Teoria

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.

Przykład z życia

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.

Kod (C#)

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);
        }
    }
}

Komentarz i wyjaśnienie kodu

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).

Ćwiczenie samodzielne

Zapisz do pliku tekstowego swoje imię i nazwisko, a następnie odczytaj i wypisz zawartość tego pliku.

Plac zabaw — wypróbuj online

Poniższy kod wykonuje się od razu w Twojej przeglądarce — nic nie trzeba instalować. Zmień kod i kliknij „Uruchom”.

CSHARP

Zadania do pracy własnej

  1. Napisz program zapisujący do pliku listę pięciu Twoich ulubionych filmów (po jednym w linii) za pomocą File.WriteAllLines(), a potem odczytujący je z powrotem.

  2. Zapisz Dictionary<string, int> (np. produkty i ich ilości w magazynie) jako plik JSON, a następnie wczytaj go z powrotem i wypisz zawartość.

  3. Zbuduj prosty "dziennik zamówień": za każdym uruchomieniem programu dopisz do pliku zamowienia.txt jedną nową linię z datą i wpisaną na sztywno kwotą zamówienia (File.AppendAllText), a na starcie programu wczytaj cały plik i wypisz sumę wszystkich dotychczasowych zamówień.

Typowe błędy

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.

Nawiązanie do egzaminu zawodowego

To realizacja efektu INF.04.3.2 z podstawy programowej w zakresie "typu plikowego" jako złożonego typu danych, a także praktyczne przygotowanie pod obsługę plików i danych JSON wymaganą w INF.04.6 (aplikacje mobilne, m.in. Preferences i lokalny zapis danych).