KWALIFIKACJA INF2 + INF3 - STYCZEŃ 2013

PYTANIE NR 26.
Przeanalizuj program podany w tabelce i określ, jaki będzie efekt jego działania.
Ilustracja przedstawia fragment kodu w języku C++, który jest częścią pytania egzaminacyjnego dla technika programisty.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Po zapisie liczb do "pierwszy.txt" plik jest zamykany, a następnie ponownie otwierany przez ofstream bez flag.
Domyślnie oznacza to tryb wyjścia z truncacją, więc zawartość "pierwszy.txt" zostaje wyczyszczona i po zamknięciu pozostaje pusty. Potem tworzony jest "drugi.txt" i zapisywane są dwie puste linie oraz liczba 100.

Pełne wyjaśnienie:

Program używa strumienia plikowego do zapisu (ofstream). Najpierw otwiera plik "pierwszy.txt" w konstruktorze strumienia, zapisuje do niego wartości a i b, po czym wykonuje zamknięcie.

Kluczowy jest moment ponownego otwarcia "pierwszy.txt" metodą open() bez podania dodatkowych trybów. Dla ofstream typowym domyślnym zestawem jest zapis z truncacją (czyli utworzenie pliku od nowa lub wyczyszczenie istniejącego). To oznacza, że nawet jeśli wcześniej wpisano tam "5" i "5.5", to ponowne otwarcie powoduje skasowanie zawartości. Natychmiastowe zamknięcie po tym otwarciu pozostawia "pierwszy.txt" jako plik pusty.

Następnie ten sam strumień otwiera plik "drugi.txt" i wykonuje zapis: dwa znaki nowej linii (co skutkuje dwiema pustymi liniami na początku) oraz wartość 100. Po zamknięciu pliku finalny efekt działania programu to: pusty "pierwszy.txt" oraz "drugi.txt" zawierający 100 poprzedzone dwiema pustymi liniami.

Dlaczego pozostałe odpowiedzi są błędne?

  • Warianty, w których "pierwszy.txt" nadal zawiera 5 i 5.5, pomijają skutek ponownego open() (truncacja).
  • Warianty, w których 5.5 trafia do "drugi.txt", są sprzeczne z kodem: do "drugi.txt" zapisywane jest wyłącznie endl, endl i 100.
  • Wariant "pierwszy.txt = 100" nie zgadza się z instrukcjami zapisu: liczba 100 pojawia się dopiero po otwarciu "drugi.txt".

W praktyce, aby nie tracić danych przy ponownym otwarciu pliku do zapisu, stosuje się dopisywanie (tryb append) albo inne kombinacje trybów zależnie od potrzeb. Na egzaminie warto zawsze śledzić stan pliku po każdej operacji close() i open().

Dodatkowe pytania

Dodatkowe pytania (FAQ):

Domyślnie ofstream otwiera plik do zapisu w sposób, który zwykle tworzy nowy plik lub czyści istniejący (truncacja).

W praktyce oznacza to, że samo ponowne otwarcie pliku do zapisu może usunąć wcześniejszą treść, jeśli nie użyjesz trybu dopisywania.

Bo ponowne otwarcie strumienia wyjściowego bez dodatkowych flag jest traktowane jak otwarcie do zapisu z "wyzerowaniem" zawartości.

Jeśli plik istnieje, jego długość zostaje ustawiona na 0, więc po natychmiastowym close() zostaje plik pusty.

Dopisywanie oznacza dodawanie danych na końcu istniejącego pliku, a nadpisywanie (z truncacją) usuwa starą zawartość i zapis zaczyna się od początku.

W zadaniach egzaminacyjnych zwracaj uwagę, czy jest użyty tryb dopisywania, czy otwarcie "domyślne".

endl zapisuje znak nowej linii (przejście do następnego wiersza), a często dodatkowo wymusza opróżnienie bufora strumienia.

W pliku tekstowym to realnie pojawia się jako przejście do kolejnej linii, więc dwa razy endl to dwie kolejne nowe linie.

Do "drugi.txt" są zapisywane dwie nowe linie, a następnie liczba 100.

W efekcie na początku pliku pojawią się dwie puste linie, a dopiero potem w kolejnej linii tekst "100". To wynika z kolejności: endl, endl, 100.

W wielu przypadkach plik zostanie zamknięty automatycznie przy zniszczeniu obiektu strumienia (np. na końcu zakresu).

Na egzaminie i w praktyce warto jednak używać close() świadomie, by kontrolować moment zapisu, zwalnianie uchwytu i możliwość ponownego otwarcia w innym trybie.

Najczęstszy błąd to pomijanie skutków ponownego otwarcia pliku: wiele osób pamięta pierwszy zapis, ale nie zauważa, że kolejne open() może wyczyścić plik.

Drugi typ błędu to mylenie, do którego pliku trafia dana wartość, gdy ten sam strumień otwiera różne pliki po kolei.

Tryb dopisywania stosuje się, gdy chcesz zachować istniejącą zawartość i dopisać nowe dane na końcu, np. w logach, raportach lub historii zdarzeń.

Domyślne otwarcie do zapisu jest dobre, gdy świadomie generujesz plik od zera i stara treść ma zostać zastąpiona.

Bo kolejność operacji zmienia stan pliku: zapis po pierwszym otwarciu może zostać unieważniony przez kolejne otwarcie z truncacją.

Analizując kod, warto prowadzić krótką "symulację": po każdej linii określ, który plik jest otwarty i co dokładnie zostało w nim zapisane.

Ćwicz analizę krok po kroku: wypisz stan zmiennych, aktualnie otwarty plik i jego zawartość po każdej instrukcji.

Powtórz pojęcia: buforowanie, nowe linie, tryby otwarcia (truncacja, dopisywanie) i konsekwencje ponownego open(). To typowe pułapki w testach.

info

To pytanie poprawnie rozwiązuje 31% zdających egzamin. bardzo trudne

W praktyce zawodowej kluczowe jest to, że potem tworzony jest "drugi.txt" i zapisywane są dwie puste linie oraz liczba 100.

Źródła:

  • cppreference.com: std::basic_ofstream::open (informacje o trybach otwarcia i ios::trunc) – https://en.cppreference.com/w/cpp/io/basic_ofstream/open – dostęp 2026-03-02
  • cppreference.com: std::ios_base::openmode (znaczenie ios::out, ios::trunc, ios::app) – https://en.cppreference.com/w/cpp/io/ios_base/openmode – dostęp 2026-03-02
  • cplusplus.com: ofstream::open (opis parametrów i trybów otwierania plików) – https://cplusplus.com/reference/fstream/ofstream/open/ – dostęp 2026-03-02

Materiały:

  • Dokumentacja referencyjna C++ dotycząca strumieni plikowych (fstream) i trybów otwierania
  • Kurs/rozdział o operacjach wejścia-wyjścia w C++ (I/O streams) z przykładami ofstream/open/close
  • Ćwiczenia: przewidywanie zawartości plików po wykonaniu fragmentów kodu (analiza krokowa)

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego