Wczytywanie Plików (.txt) na Maturze z Informatyki
Wczytywanie danych z plików to absolutny fundament *każdego* zadania programistycznego na maturze. Każde zadanie z części praktycznej da Ci jeden lub więcej plików `.txt` (np. `dane.txt`, `liczby.txt`) i poprosi o ich przetworzenie. Twoim pierwszym krokiem *zawsze* będzie napisanie kodu, który otworzy ten plik, wczyta jego zawartość linia po linii i zamieni tekst na liczby lub inne dane, na których można pracować. Bez tej umiejętności nie zdobędziesz punktów za żadne zadanie z programowania. Na szczęście, jest to proces bardzo schematyczny. W Pythonie sprowadza się do pętli `for linia in plik:`, a w C++ do `while (plik >> zmienna)`. Ten przewodnik pokaże Ci dokładnie, jak to robić.
Dlaczego to ważne? Nie ma matury z informatyki bez wczytywania plików. To jest pierwszy i najważniejszy krok w każdym zadaniu algorytmicznym i programistycznym. Musisz umieć wczytać jedną liczbę na linię, wiele liczb na linię, a także mieszkankę tekstu i liczb. Opanowanie tego schematu to 50% sukcesu w zadaniach z plikami.
Teoria
Wczytywanie pliku tekstowego to proces składający się z trzech kroków: 1. Otwarcie pliku (połączenie programu z plikiem na dysku). 2. Czytanie danych (zazwyczaj linia po linii w pętli). 3. Zamknięcie pliku (zwolnienie zasobów). W Pythonie najlepszą praktyką jest użycie `with open(...)`, które automatycznie zamyka plik. W C++ używamy obiektu `ifstream`.
Jak to działa?
- Pliki tekstowe (.txt): Na maturze pracujesz na plikach tekstowych. Pamiętaj, że nawet jeśli w pliku jest liczba `123`, to dla komputera jest to string `'123\n'` (zawsze ze znakiem nowej linii `\n` na końcu).
- Krok 1: Otwarcie pliku
- * Python: `with open('dane.txt', 'r') as f:` ('r' oznacza 'read' - odczyt).
- * C++: `ifstream plik("dane.txt");` (musisz dołączyć `#include <fstream>`).
- Krok 2: Czytanie w pętli (najczęstszy schemat)
- * Python: `for linia in f:` (pętla automatycznie czyta plik linia po linii).
- * C++ (dla danych oddzielonych spacjami): `while (plik >> a >> b)` (czyta dane do zmiennych, pomijając białe znaki).
- * C++ (dla całych linii): `while (getline(plik, linia))`.
- Krok 3: Przetwarzanie (Parsowanie)
- * Python: Zawsze używaj `linia.strip()` aby usunąć `\n`! Następnie `int(linia.strip())` aby zamienić na liczbę. Użyj `linia.split()` aby podzielić linię ze spacjami.
- * C++: Operator `>>` automatycznie konwertuje tekst na typ zmiennej (np. `int`).
- Krok 4: Zamknięcie pliku
- * Python: `with open(...)` robi to za Ciebie automatycznie.
- * C++: `plik.close();` (dobra praktyka, choć destruktor zrobi to sam po wyjściu z zasięgu).
Złożoność: Złożoność czasowa wczytania pliku zależy liniowo od liczby linii (lub liczby danych), które musimy przetworzyć. Można to zapisać jako O(n), gdzie 'n' to liczba linii lub łączny rozmiar danych.
Implementacja
Wczytywanie 1 liczby na linię (Najczęstszy przypadek)
Python# Plik 'liczby.txt' wygląda tak:
# 10
# 25
# 30
sSuma = 0
dane_do_listy = []
with open('liczby.txt', 'r') as f:
for linia in f:
# linia to np. "10\n"
oczyszczona_linia = linia.strip() # teraz to "10"
liczba = int(oczyszczona_linia) # teraz to 10 (liczba)
sSuma += liczba
dane_do_listy.append(liczba)
print(f"Suma: {sSuma}")
print(f"Wczytane dane: {dane_do_listy}")To jest najważniejszy schemat na maturę. `with open(...)` otwiera plik. `for linia in f:` czyta każdą linię. `linia.strip()` jest KRYTYCZNE - usuwa znak nowej linii `\n`. `int()` konwertuje string na liczbę.
Wczytywanie 2 (lub więcej) liczb na linię
Python# Plik 'prostokaty.txt' wygląda tak:
# 10 5
# 20 30
# 4 8
with open('prostokaty.txt', 'r') as f:
for linia in f:
# linia to np. "10 5\n"
oczyszczona = linia.strip() # "10 5"
czesci = oczyszczona.split(' ') # ['10', '5']
h = int(czesci[0])
s = int(czesci[1])
print(f"Pole: {h * s}")
# Szybsza wersja (dla zaawansowanych):
# for linia in f:
# h, s = map(int, linia.split())Gdy masz wiele danych w linii, po `strip()` użyj `.split(' ')`. Dzieli to string na listę stringów (używając spacji jako separatora). Następnie musisz skonwertować każdy element tej listy na `int`.
Wczytywanie 1 lub 2 liczb na linię (Najprostszy sposób)
C++#include <iostream>
#include <fstream> // Do plików
#include <string>
using namespace std;
int main() {
// Plik 'liczby.txt' (10, 25, 30...)
ifstream plik1("liczby.txt");
int liczba;
int suma = 0;
while (plik1 >> liczba) {
// operator >> sam pomija białe znaki (spacje,
) i konwertuje na int
suma += liczba;
}
cout << "Suma: " << suma << endl;
plik1.close();
// Plik 'prostokaty.txt' (10 5, 20 30...)
ifstream plik2("prostokaty.txt");
int h, s;
while (plik2 >> h >> s) {
// C++ automatycznie wczyta pierwszą liczbę do h, a drugą do s
cout << "Pole: " << h * s << endl;
}
plik2.close();
return 0;
}W C++ operator `>>` jest bardzo potężny. On automatycznie pomija spacje i znaki nowej linii i próbuje wczytać dane do zmiennej, od razu je konwertując. Warunek `while (plik >> ...)` jest prawdziwy, dopóki wczytywanie się udaje.
Wczytywanie całych linii (np. ze spacjami)
C++#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
// Kiedy linia to np. "Ala ma kota"
ifstream plik("dane_tekstowe.txt");
string linia;
// Użyj getline, aby wczytać CAŁĄ linię (ze spacjami)
while (getline(plik, linia)) {
// 'linia' zawiera teraz np. "Ala ma kota"
cout << "Wczytano: " << linia << endl;
}
plik.close();
return 0;
}Jeśli chcesz wczytać całą linię (ze spacjami) jako jeden string, nie możesz użyć `plik >> linia`, bo zatrzyma się na pierwszej spacji. Musisz użyć funkcji `getline(plik, linia)`.
Przykładowe Zadania Maturalne
W pliku 'dane.txt' znajduje się 200 wierszy. Każdy wiersz zawiera *jedną* dodatnią liczbę całkowitą. Napisz program, który wczyta wszystkie liczby i wypisze, ile z nich jest liczbami parzystymi.
Wskazówka: To najprostszy schemat. Użyj pętli `for linia in plik:` (Python) lub `while (plik >> liczba)` (C++). W pętli sprawdzaj warunek `liczba % 2 == 0` i zwiększaj licznik.
Pokaż szkic rozwiązania
1. Otwórz plik 'dane.txt' do odczytu. 2. Zainicjuj `licznik_parzystych = 0`. 3. Dla każdej linii w pliku: a. (Python) `liczba = int(linia.strip())`. b. (C++) Pętla `while (plik >> liczba)` zrobi to automatycznie. c. Sprawdź: `if liczba % 2 == 0:` d. ` licznik_parzystych += 1` 4. Wypisz `licznik_parzystych`.
W pliku prostokaty.txt opisano 5000 prostokątów, po jednym w każdym wierszu. Opis każdego prostokąta składa się z dwóch dodatnich liczb całkowitych nie większych od 40 000, oddzielonych spacją. Pierwszą z tych liczb będziemy nazywać wysokością prostokąta, a drugą - jego szerokością. Podaj najmniejsze i największe pole powierzchni dla prostokątów z pliku.
Wskazówka: Tutaj musisz wczytać *dwie* liczby z każdej linii. W Pythonie użyj `linia.split()` i konwersji na `int`. W C++ po prostu użyj `while (plik >> h >> s)`. W pętli obliczaj pole (`h * s`) i na bieżąco aktualizuj zmienne `min_pole` i `max_pole`.
Pokaż szkic rozwiązania
1. Otwórz plik 'prostokaty.txt'. 2. Zainicjuj `min_pole = 999999999` (lub pierwsza wartość z pliku). 3. Zainicjuj `max_pole = 0`. 4. Dla każdej linii w pliku: a. (Python) `h, s = map(int, linia.split())`. b. (C++) Pętla `while (plik >> h >> s)`. c. Oblicz `pole = h * s`. d. `if pole < min_pole: min_pole = pole`. e. `if pole > max_pole: max_pole = pole`. 5. Po pętli wypisz `min_pole` i `max_pole`.
Częste Błędy
❌ Python: `ValueError: invalid literal for int() ...`
To najczęstszy błąd. Próbujesz zrobić `int('123\n')`. Stało się tak, bo zapomniałeś usunąć znaku nowej linii (`\n`) z końca stringa.
Poprawka: ZAWSZE używaj `.strip()` przed konwersją na liczbę: `liczba = int(linia.strip())`.
❌ Python: `ValueError` przy wielu liczbach
Próbujesz zrobić `int('10 5')`. Stało się tak, bo w linii jest spacja, a ty zapomniałeś użyć `.split()`.
Poprawka: Użyj `czesci = linia.split()` i dopiero potem `h = int(czesci[0])` oraz `s = int(czesci[1])`.
❌ C++: `while (!plik.eof())`
To klasyczna pułapka w C++. Ta pętla wykonuje się o jeden raz za dużo i ostatnia wczytana wartość jest przetwarzana dwukrotnie.
Poprawka: Nigdy nie używaj `!plik.eof()`. Zamiast tego, umieść operację wczytywania w warunku pętli: `while (plik >> liczba)` lub `while (getline(plik, linia))`. To jest poprawny idiom C++.
❌ C++: `plik >> linia` zamiast `getline`
Masz plik z imionami i nazwiskami (`Jan Kowalski`). Piszesz `string linia; plik >> linia;`. W zmiennej `linia` ląduje tylko 'Jan', bo `>>` zatrzymuje się na spacji.
Poprawka: Jeśli chcesz wczytać całą linię ze spacjami, *zawsze* używaj `getline(plik, linia)`.
❌ `FileNotFoundError` (Błąd otwarcia pliku)
Program nie może znaleźć pliku. Najczęstsze powody: literówka w nazwie pliku (`dane.txt` vs `danetxt`) lub plik nie jest w tym samym folderze co skrypt/program.
Poprawka: Sprawdź trzy razy nazwę pliku. Upewnij się, że plik `.py` lub `.cpp` jest w *tym samym katalogu* co plik `.txt`.
Kluczowe Wnioski
- Wczytanie pliku to podstawa każdego zadania maturalnego.
- Python: Najlepszy schemat to `with open('plik.txt', 'r') as f:`.
- Python: `for linia in f:` czyta linia po linii.
- Python: `linia.strip()` (usuwa `\n`) i `linia.split()` (dzieli po spacji) to Twoje kluczowe narzędzia.
- C++: Musisz dodać `#include <fstream>`.
- C++: Do wczytywania danych oddzielonych spacjami/enterami używaj `ifstream plik("..."); while (plik >> zmienna1 >> zmienna2) ...`.
- C++: Do wczytywania całych linii (ze spacjami) używaj `while (getline(plik, linia))`.
Najczęściej Zadawane Pytania
❓ Dlaczego w Pythonie muszę używać `strip()`?
Każda linia w pliku tekstowym (oprócz ewentualnie ostatniej) kończy się niewidzialnym znakiem nowej linii (`\n`). Gdy robisz `int('123\n')` program zgłasza błąd. `linia.strip()` usuwa ten znak (i inne białe znaki) z początku i końca.
❓ Jak wczytać plik do listy (tablicy) w Pythonie?
Stwórz pustą listę `dane = []` przed pętlą. Wewnątrz pętli `for linia in f:`, po przetworzeniu linii (strip, int), dodaj wynik do listy: `dane.append(liczba)`.
❓ Jak w C++ wczytać plik do `vector`?
Stwórz `vector<int> dane;` i `int temp;` przed pętlą. Wewnątrz pętli `while (plik >> temp)` dodawaj element do wektora: `dane.push_back(temp)`.
❓ Jak pominąć pierwszą linię (nagłówek) w pliku?
W Pythonie, przed pętlą `for`, po prostu wczytaj ją raz 'w próżnię': `f.readline()`. W C++ podobnie: `getline(plik, zmienna_na_smieci);`.
Chcesz opanować wszystkie tematy maturalne?
Dołącz do kursu i zyskaj dostęp do interaktywnych lekcji, edytora kodu i setek zadań.