Czy można modyfikować pliki z danymi na maturze z informatyki?

Opublikowano

Czy można modyfikować pliki .txt na maturze z informatyki? TAK, ale z zasadami! Dowiedz się co wolno zmieniać, jak to robić i jakie są konsekwencje błędów.

Całe nagranie: ok. 8 min.


Jednym z najczęściej zadawanych pytań przez maturzystów z informatyki jest to, czy można zmieniać zawartość plików tekstowych z danymi podczas egzaminu. W tym artykule wyjaśnimy wszystkie wątpliwości związane z tym tematem i pokażemy, jak poprawnie radzić sobie z problematycznymi przypadkami.

Dlaczego ktoś chciałby modyfikować plik z danymi?

Istnieją dwa główne scenariusze, w których uczniowie zastanawiają się nad modyfikacją plików:

1. Błędne dane w pliku

Pierwszym przypadkiem są błędne dane na maturze. Warto jednak podkreślić, że zdarzają się one bardzo rzadko. Jeśli program nie działa poprawnie, problem zazwyczaj leży w kodzie, a nie w pliku z danymi.
Co jednak w sytuacji, gdy mamy stuprocentową pewność, że plik jest błędny? Wyobraźmy sobie, że w poleceniu napisano, iż plik zawiera wyłącznie liczby, a w rzeczywistości znajduje się tam również tekst w kilku miejscach.
W takiej sytuacji należy napisać program, który działa poprawnie dla poprawnych danych. Centralna Komisja Egzaminacyjna (CKE) ocenia zadania w sposób uwzględniający usunięcie błędnych linii. Teoretycznie można usunąć te błędne fragmenty do testów, ale takie sytuacje są rzadkie. Przed podjęciem takiej decyzji warto dokładnie przeanalizować program i polecenie.

2. Pusta linia na końcu pliku

Drugi przypadek jest znacznie częstszy i dotyczy obecności pustej linii w plikach tekstowych z danymi. To właśnie z tym problemem wiąże się większość pytań od uczniów.
Dlaczego ta pusta linia jest tak problematyczna? Problem ten dotyka głównie programy napisane w C++, dlatego skupimy się na tym języku programowania (w Pythonie odczyt plików działa inaczej - różnice opisujemy w artykule jaki język programowania wybrać na maturę).

Przykłady, w których ostatnia linia pliku psuje wynik

Przykład 1: Matura podstawowa 2017 - zadanie 4

W zadaniu 4.1 z matury podstawowej 2017 mieliśmy plik „liczby.txt” z tysiącem trójek liczb. Zadanie polegało na policzeniu, w ilu wierszach pliku liczby są uporządkowane rosnąco.

Polecenie zadania 4.1 z matury podstawowej z informatyki 2017 - plik liczby.txt z tysiącem trójek liczb


Gdy zajrzymy do pliku tekstowego, widzimy rzeczywiście tysiąc wierszy z liczbami. Jednak poza tym znajduje się tam również tysiąc pierwsza linijka, która jest pusta.

Pusta tysiąc pierwsza linia na końcu pliku liczby.txt z matury 2017


Program napisany w C++ uruchamia się poprawnie i zwraca wynik 140. Na pierwszy rzut oka wszystko wygląda w porządku. Jednak gdy sprawdzamy klucz odpowiedzi, okazuje się, że poprawna odpowiedź to 139, czyli jest o 1 większa od naszego wyniku.

Program wczytuje kolejne trójki liczb z pliku i sprawdza, czy druga liczba jest większa od pierwszej, a trzecia większa od drugiej. Jeśli tak, zwiększa licznik o jeden. Logika programu jest poprawna - zadanie wydaje się proste i trudno tu o błąd.
Eksperyment: Po usunięciu ostatniej pustej linijki z pliku tekstowego program zwraca poprawny wynik!

Przykład 2: Matura czerwcowa 2021 - zadanie z napisami

W zadaniu 4.1 z czerwcowej matury 2021 mieliśmy plik z tysiącem napisów składających się z pięćdziesięciu znaków. Niektóre znaki to duże litery alfabetu, inne to cyfry. Zadanie polegało na podaniu łącznej liczby cyfr we wszystkich napisach.

Polecenie zadania 4.1 z czerwcowej matury z informatyki 2021 - plik z tysiącem napisów


Tak samo jak w poprzednim przykładzie - w pliku tekstowym widzimy tysiąc wierszy z danymi i ostatnią pustą linijkę numer tysiąc jeden.

Pusta ostatnia linia na końcu pliku napisy.txt z czerwcowej matury 2021


Program w C++ korzysta z prostej funkcji sprawdzającej, czy znak jest cyfrą (sprawdza, czy kod ASCII mieści się w odpowiednim przedziale). Dla każdego znaku każdego napisu wywołuje funkcję i zwiększa zmienną liczącą cyfry. Po uruchomieniu otrzymujemy wynik 11 854.

I znowu niespodzianka! Poprawny wynik to 11 844 - o 10 mniej od naszego wyniku.
Analogicznie jak w poprzednim zadaniu - po usunięciu pustej linijki z pliku tekstowego wynik staje się poprawny.

Dlaczego pusta linijka jest problematyczna?

Aby zrozumieć problem, przeanalizujmy jak działa proces odczytywania pliku przez C++:

  1. Odczyt normalnych linii: Wartości wczytane z linii zostają umieszczone w zmiennych. Funkcja plik.eof() zwraca false, więc pętla wykonuje się dalej.
  2. Ostatnia niepusta linia: Wartości zmiennych zostają poprawnie zaktualizowane.
  3. Próba odczytu pustej linijki: Operator ekstrakcji danych >> pomija białe znaki, więc wartości zmiennych NIE ZOSTAJĄ ZAKTUALIZOWANE, ale pętla nadal je przetwarza.
  4. Końcowy efekt: Przedostatnia linia pliku zostaje przetworzona dwukrotnie, ponieważ program analizuje ją raz po prawidłowym odczycie, a drugi raz po nieudanej próbie odczytu pustej linii.

Dopiero po próbie odczytu ostatniej linii plik.eof() zwraca true i kończy się wykonywanie pętli.

Kluczowa zasada

Metoda eof() (end of file) nie zostanie ustawiona na true, dopóki nie nastąpi próba odczytu poza końcem pliku. Gdy ostatnia linijka jest pusta, po wczytaniu przedostatniej linijki eof() nadal zwraca false. Pętla wykonuje się ponownie i próbuje wczytać pustą ostatnią linijkę, ale operacja kończy się niepowodzeniem. Dane z przedostatniej linijki pozostają w zmiennej i są przetwarzane po raz drugi, zanim eof() zostanie ustawione na true.

Czy można modyfikować pliki na maturze?

Odpowiedź brzmi: NIE.

Dowody z oficjalnych źródeł:

1. Informacje w najnowszych maturach:
Pod koniec poleceń czytamy: „Pamiętaj, że Twój program musi ostatecznie zadziałać na pliku liczby.txt z 3000 liczb w pierwszym wierszu”. To oznacza, że na maturze program musi zadziałać dla oryginalnego pliku.

Fragment polecenia maturalnego: program musi ostatecznie zadziałać na pliku liczby.txt z 3000 liczb w pierwszym wierszu


2. Informacja ze strony 7. informatora maturalnego o egzaminie maturalnym z informatyki:

Fragment strony 7 informatora maturalnego z informatyki - programy są testowane przez egzaminatorów


Z tego punktu wprost wynika, że programy będą testowane przez egzaminatorów. Na maturze do oceny oddajemy wyłącznie program - plików tekstowych z danymi już nie. Jeśli nie masz pewności, które pliki i w jaki sposób trafiają do egzaminatora, sprawdź poradnik jak oddawać zadania na maturze z informatyki.
Konsekwencje: Jeśli usuniemy pustą linię z pliku, program będzie działał poprawnie podczas naszych testów. Jednak egzaminator do testów użyje oryginalnego pliku z problematyczną pustą linią. Program zwróci błędny wynik i zgodnie z informatorem możemy nie otrzymać punktów za zadanie.

Jak poprawnie rozwiązać problem?

Opcja 1: Użycie metody fail()

Zostawiamy warunek !plik.eof(), wczytujemy kolejne liczby za pomocą operatorów ekstrakcji plik >> a >> b >> c i przed wykonywaniem kodu dotyczącego warunku umieszczamy instrukcję if z plik.fail() oraz break; w środku:

Podczas próby odczytu pustej linii plik.fail() zwróci true i pętla zostanie przerwana.

Opcja 2: Przeniesienie odczytu do warunku pętli

W ten sposób program będzie wczytywał dane dopóki jest coś do wczytania:

Uwaga: Zapis plik >> linia powinien znajdować się TYLKO w warunku pętli. Umieszczenie go także wewnątrz pętli spowoduje, że w każdej iteracji będą odczytywane dwie linijki - jedna przez warunek, druga przez wywołanie wewnątrz pętli. Przez to połowa linii z pliku zostanie pominięta.

Opcja 3: Użycie funkcji getline()

Ta metoda jest szczególnie przydatna, gdy pracujemy z całymi liniami tekstu zawierającymi spacje:

Pamiętajmy, żeby nie dodawać getline() także wewnątrz pętli - ma być tylko w warunku.

Podsumowanie

Na maturze z informatyki nie można modyfikować plików z danymi. Zgodnie z wymaganiami CKE program powinien działać dla oryginalnego pliku tekstowego z danymi, ponieważ egzaminatorzy będą testować rozwiązania na oryginalnych plikach, a być może także na dodatkowych zestawach testowych.
Kluczem do sukcesu jest napisanie kodu, który poprawnie radzi sobie z problematycznymi przypadkami, takimi jak puste linie na końcu pliku. Przedstawione powyżej metody pozwalają na stworzenie programów odpornych na tego typu problemy, co zapewnia poprawne działanie zarówno podczas własnych testów, jak i podczas oficjalnej oceny przez egzaminatorów.

Najczęściej zadawane pytania dot. artykułu (FAQ)

Nie. Zgodnie z informatorem CKE i poleceniami w arkuszach program musi ostatecznie zadziałać na oryginalnym pliku z danymi. Do oceny oddajesz wyłącznie program, a egzaminator testuje go na oryginalnym pliku (a często także na dodatkowych zestawach testowych), więc usunięcie np. pustej linii może pozbawić Cię punktów.

Metoda eof() ustawia się na true dopiero po nieudanej próbie odczytu poza końcem pliku. Gdy ostatnia linia jest pusta, po wczytaniu przedostatniej linii eof() wciąż zwraca false, więc pętla wykonuje się jeszcze raz. Operator >> pomija białe znaki i nie aktualizuje zmiennych, przez co dane z przedostatniej linii zostają przetworzone dwukrotnie.

Masz trzy bezpieczne sposoby: dodać po odczycie warunek if (plik.fail()) break;, przenieść odczyt do warunku pętli (while (plik >> linia)) albo użyć while (getline(plik, linia)). W dwóch ostatnich przypadkach pamiętaj, aby nie powtarzać odczytu wewnątrz pętli, bo połowa linii zostanie pominięta.

Program ma działać poprawnie dla poprawnych danych, a CKE ocenia zadania z uwzględnieniem usunięcia błędnych wierszy. Błędne dane w pliku zdarzają się jednak bardzo rzadko - najczęściej problem leży w kodzie, dlatego przed jakąkolwiek ingerencją dokładnie przeanalizuj program i polecenie.

Do oceny oddajesz program (kod źródłowy) oraz pliki z wynikami. Pliku z danymi wejściowymi już nie oddajesz, dlatego Twój kod musi działać na oryginalnym, niezmienionym pliku przygotowanym przez CKE.

© 2026 Software Bay. Design with ♥