średniProgramowaniePythonC++

Zapisywanie Danych do Pliku (.txt) na Maturze z Informatyki

10 min czytania
Python, C++
Zaktualizowano: 3.11.2025

Umiejętność zapisywania wyników do pliku jest równie ważna, co samo rozwiązanie zadania. Na maturze Twoje odpowiedzi *muszą* trafić do konkretnych plików wyjściowych (np. `wyniki4_1.txt`). Egzaminator nie będzie uruchamiał Twojego kodu – on sprawdzi tylko zawartość plików, które wygenerowałeś. Oznacza to, że możesz mieć genialny algorytm, ale jeśli nie zapiszesz jego wyniku poprawnie do pliku, otrzymasz zero punktów za zadanie. Proces ten jest na szczęście schematyczny: musisz otworzyć plik w trybie do zapisu ('w'), wstawić do niego dane (które *muszą* być tekstem!) i pamiętać o dodawaniu znaków nowej linii (`\n`), aby wyniki nie były 'sklejone'.

Dlaczego to ważne? To jest dosłownie Twój 'bilet do punktów'. Każde zadanie programistyczne na maturze kończy się poleceniem: 'Odpowiedź zapisz w pliku wynikiX.txt'. Musisz perfekcyjnie opanować otwieranie pliku w trybie zapisu, konwertowanie liczb na stringi (tekst) i dbanie o formatowanie, zwłaszcza o nowe linie.

Teoria

Proces zapisu do pliku jest odwrotnością odczytu. Najpierw otwierasz 'strumień' do pliku, ale tym razem w trybie zapisu (`'w'` - write) lub dopisywania (`'a'` - append). Tryb `'w'` *kasuje* całą zawartość pliku, jeśli ten istniał, i tworzy go, jeśli nie. Tryb `'a'` *dopisuje* nowe dane na końcu pliku, nie usuwając starych. Kluczowa zasada: do pliku tekstowego możesz zapisywać tylko *stringi* (tekst).

Jak to działa?

  1. Krok 1: Otwarcie pliku w trybie zapisu.
  2. * Python: `with open('wyniki.txt', 'w') as f:` (tryb 'w' - write, nadpisuje plik).
  3. * Python (dopisywanie): `with open('wyniki.txt', 'a') as f:` (tryb 'a' - append, dopisuje na końcu).
  4. * C++: `ofstream plik("wyniki.txt");` (domyślnie tryb 'w').
  5. * C++ (dopisywanie): `ofstream plik("wyniki.txt", ios::app);`.
  6. Krok 2: Konwersja danych na string.
  7. * W C++ operator `<<` robi to automatycznie: `plik << 123;`.
  8. * W Pythonie to Twój obowiązek: `f.write(str(123))`. Próba `f.write(123)` da błąd `TypeError`.
  9. Krok 3: Zapisywanie i dodawanie znaku nowej linii (`\n`).
  10. * Samo `f.write("Anna")` nie przejdzie do nowej linii. Musisz jawnie dodać znak `\n`:
  11. * Python: `f.write("Anna\n")` lub `f.write(f"{zmienna}\n")`.
  12. * C++: `plik << "Anna" << endl;` lub `plik << "Anna\n";` (`\n` jest szybsze).
  13. Krok 4: Zamknięcie pliku.
  14. * Python: `with open(...)` zamyka plik automatycznie, nawet jeśli wystąpi błąd. Jest to zalecana metoda.
  15. * C++: Musisz jawnie zamknąć plik: `plik.close();`. Jest to krytyczne - bez tego dane mogą nie zostać w pełni zapisane (zostaną w buforze).

Złożoność: Nie dotyczy w sensie O(n). Złożoność zależy od ilości danych do zapisania na dysku. Na maturze jest to zawsze operacja natychmiastowa.

Implementacja

Zapisywanie (tryb 'w') - nadpisywanie pliku

Python
liczba = 123
nazwa = "Wynik"

# 'w' - write (nadpisz plik, jeśli istnieje, lub stwórz nowy)
with open('wyniki.txt', 'w') as f:
    f.write("To jest mój plik z wynikami.\n")
    f.write("Nowa linia.\n")
    
    # Zapisywanie liczb: MUSISZ zamienić na string!
    f.write(str(liczba) + "\n") # Sposób 1: str()
    f.write(f"{nazwa}: {liczba * 2}\n") # Sposób 2: f-string (ZALECANY!)

# Plik 'wyniki.txt' zostanie automatycznie zamknięty.

Użycie `with open(...)` to najlepsza praktyka. `f.write()` przyjmuje *tylko jeden* argument (string). F-string (`f"{zmienna}\n"`) to najprostszy sposób na formatowanie tekstu i liczb oraz dodanie znaku nowej linii `\n`.

Dopisywanie (tryb 'a') - dodawanie do końca pliku

Python
# 'a' - append (dopisz na końcu pliku, nie kasuj starej zawartości)
with open('wyniki.txt', 'a') as f:
    f.write("Ta linia zostanie dopisana na końcu.\n")
    f.write("I jeszcze jedna.\n")

Tryb `'a'` jest przydatny, jeśli chcesz coś dodać bez utraty tego, co już było w pliku. Na maturze jednak najczęściej używasz trybu `'w'`, aby mieć pewność, że plik z wynikami jest 'świeży' i nie zawiera starych danych.

Zapisywanie i dopisywanie (ofstream)

C++
#include <iostream>
#include <fstream> // Kluczowe dla plików
#include <string>

using namespace std;

int main() {
    // 1. Zapisywanie (tryb 'w' - domyślny)
    ofstream plik_zapis("wyniki.txt");

    if (plik_zapis.is_open()) {
        int liczba = 123;
        string nazwa = "Wynik";

        plik_zapis << "To jest mój plik z wynikami.\n";
        plik_zapis << "Nowa linia.\n";
        
        // C++ automatycznie konwertuje liczby na tekst
        plik_zapis << liczba << "\n";
        plik_zapis << nazwa << ": " << (liczba * 2) << "\n";

        plik_zapis.close(); // Bardzo ważne!
    } 

    // 2. Dopisywanie (tryb 'a' - ios::app)
    ofstream plik_dopisz("wyniki.txt", ios::app);
    if (plik_dopisz.is_open()) {
        plik_dopisz << "Ta linia zostanie dopisana.\n";
        plik_dopisz.close();
    }

    return 0;
}

W C++ musisz dołączyć `<fstream>`. Używamy obiektu `ofstream` ('output file stream'). Operator `<<` działa tak samo jak `cout`, ale kieruje dane do pliku. Automatycznie konwertuje liczby. `plik.close()` jest krytyczne dla poprawnego zapisu.

Przykładowe Zadania Maturalne

Matura 2026Zadanie Zadanie Typu Maturalnego 1

Napisz program, który stworzy plik 'potegi.txt' i zapisze w nim 10 pierwszych potęg liczby 2 (zaczynając od 2^1). Każda liczba ma być w osobnej linii.

Wskazówka: Użyj pętli `for i in range(1, 11):`. W każdej iteracji oblicz `potega = 2i`. Otwórz plik w trybie 'w' *przed* pętlą. W pętli zapisuj wynik do pliku, pamiętając o konwersji na string i znaku nowej linii `\n`.

Pokaż szkic rozwiązania
1. Otwórz plik: `with open('potegi.txt', 'w') as f:`
2. Rozpocznij pętlę: `potega = 1`
3. `for i in range(1, 11):`
4. `  potega = potega * 2`
5. `  # Zapisz do pliku (z konwersją i \n)`
6. `  f.write(f"{potega}\n")`
7. Plik zamknie się automatycznie.
Matura 2024Zadanie 3.3 (Matura Maj 2024)

W pliku `skrot2.txt` znajduje się 200 dodatnich liczb całkowitych (...). Napisz program, który wypisze te liczby z pliku `skrot2.txt`, dla których największy wspólny dzielnik liczby i jej nieparzystego skrótu jest równy 7. Odpowiedź zapisz w pliku wyniki3_3.txt. Twój program powinien wypisać w każdym wierszu wyniku po jednej liczbie...

Wskazówka: To jest typowe zadanie. Najpierw *wczytujesz* plik `skrot2.txt`, a na końcu *zapisujesz* wyniki do `wyniki3_3.txt`. Otwórz plik do zapisu *przed* główną pętlą (w trybie 'w'). Kiedy w pętli znajdziesz liczbę spełniającą warunek (NWD == 7), od razu zapisz ją do pliku wynikowego.

Pokaż szkic rozwiązania
1. Zdefiniuj funkcję `nwd(a, b)` i `skrot(n)`.
2. Otwórz plik do zapisu: `plik_wynikowy = open('wyniki3_3.txt', 'w')` (lub `ofstream plik_wynikowy(...)`)
3. Otwórz plik do odczytu: `with open('skrot2.txt', 'r') as f_dane:`
4. `  for linia in f_dane:`
5. `    n = int(linia.strip())`
6. `    m = skrot(n)`
7. `    if nwd(n, m) == 7:`
8. `      # Zapisz znalezioną liczbę do pliku WYNIKOWEGO`
9. `      plik_wynikowy.write(f"{n}\n")`
10. Zamknij plik wynikowy: `plik_wynikowy.close()` (jeśli nie używasz `with`).

Częste Błędy

Python: `TypeError: write() argument must be str, not int`

Najczęstszy błąd. Próbujesz zapisać liczbę bezpośrednio do pliku: `f.write(123)`. Metoda `.write()` akceptuje *tylko* stringi.

Poprawka: Zawsze konwertuj liczbę na string: `f.write(str(123))` lub (lepiej) użyj f-stringa: `f.write(f"{123}")`.

Brak znaków nowej linii `\n`

Zapisujesz liczby w pętli: `f.write(str(liczba))`. W pliku wynikowym dostajesz jeden 'sklejony' ciąg: '102530'.

Poprawka: Musisz *ręcznie* dodawać znak nowej linii po każdym zapisie: `f.write(f"{liczba}\n")` lub `plik << liczba << "\n";`.

Otwieranie pliku w trybie 'w' *wewnątrz* pętli

Iterujesz po 1000 liczb, znajdujesz 50 pasujących. Ale `open('wyniki.txt', 'w')` jest *wewnątrz* pętli `if`. To oznacza, że za każdym razem, gdy znajdujesz pasującą liczbę, *kasujesz* plik i zapisujesz ją na nowo. W efekcie w pliku będzie tylko *ostatnia* znaleziona liczba.

Poprawka: Plik do zapisu otwieraj *zawsze* (w trybie 'w') *przed* pętlą, która przetwarza dane.

C++: Pusty plik wynikowy

Program działa, nie ma błędów, ale plik `wyniki.txt` jest pusty. Prawdopodobnie zapomniałeś zamknąć pliku: `plik.close();`.

Poprawka: Zawsze zamykaj strumień `ofstream` po zakończeniu zapisu. Bez `close()`, bufor zapisu może nie zostać opróżniony na dysk przed zakończeniem programu.

Kluczowe Wnioski

  • Na maturze wyniki *zawsze* zapisujesz do pliku.
  • Python: Używaj `with open('wyniki.txt', 'w') as f:` - to bezpieczne i automatycznie zamyka plik.
  • C++: Używaj `ofstream plik("wyniki.txt");` i *pamiętaj* o `plik.close();`.
  • Tryb `'w'` (write) nadpisuje plik (używaj go 99% czasu na maturze).
  • Tryb `'a'` (append) dopisuje na końcu pliku.
  • Do pliku możesz pisać *tylko stringi*. W Pythonie liczby trzeba konwertować (`str(liczba)` lub f-string).
  • Musisz ręcznie dodawać znaki nowej linii `\n`.

Najczęściej Zadawane Pytania

Jaka jest różnica między trybem 'w' a 'a'?

'w' (write) otwiera plik i *kasuje* całą jego dotychczasową zawartość. Jeśli plik nie istnieje, tworzy go. 'a' (append) otwiera plik i ustawia 'kursor' na *samym końcu*. Wszystko, co zapiszesz, zostanie dopisane do istniejącej treści.

Dlaczego w Pythonie `f.write(123)` nie działa, a w C++ `plik << 123;` działa?

To różnica w filozofii języków. Metoda `.write()` w Pythonie jest 'nisko-poziomowa' i oczekuje dokładnie stringa. Operator `<<` w C++ jest 'przeciążony' i ma wbudowane reguły, jak zamienić `int`, `double` czy `string` na tekst, zanim wyśle go do pliku.

Jak zapisać dwie liczby w jednej linii, oddzielone spacją?

W Pythonie użyj f-stringa: `f.write(f"{liczba1} {liczba2}\n")`. W C++ użyj operatora `<<` wielokrotnie: `plik << liczba1 << " " << liczba2 << "\n";`.

Jak zapisać polskie znaki (np. 'żółw')?

Dobrą praktyką jest jawne określenie kodowania UTF-8, które obsługuje polskie znaki. W Pythonie: `with open('wyniki.txt', 'w', encoding='utf-8') as f: f.write('żółw')`.

Chcesz opanować wszystkie tematy maturalne?

Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.

Powiązane Tematy