r17-06.pdf

(563 KB) Pobierz
Szablon dla tlumaczy
Rozdział 17.
Strumienie
Do tej pory używaliśmy cout do wypisywania tekstu na ekranie, zaś cin do odczytywania
klawiatury, wykorzystywaliśmy je bez pełnego zrozumienia ich działania.
Z tego rozdziału dowiesz się:
• czym są strumienie i jak się ich używa,
• jak zarządzać wejściem i wyjściem, wykorzystując strumienie,
• jak odczytywać i zapisywać pliki za pomocą strumieni.
Przegląd strumieni
C++ nie określa, w jaki sposób dane są wypisywane na ekranie lub zapisywane do pliku, ani w
jaki sposób są one odczytywane przez program. Operacje te stanowią jednak podstawową część
pracy z C++, więc biblioteka standardowa C++ zawiera bibliotekę iostream , która obsługuje
wejście i wyjście (I/O, input-output).
Zaletą oddzielenia funkcji wejścia-wyjścia od języka i obsługiwania ich w bibliotekach jest
możliwość łatwiejszego przenoszenia programów pomiędzy różnymi platformami. Dzięki temu
można napisać program na komputerze PC, a następnie przekompilować go i uruchomić na stacji
roboczej Sun. Producent kompilatora dostarcza odpowiednią bibliotekę i wszystko działa.
Przynajmniej w teorii.
UWAGA Biblioteka jest zbiorem plików .obj , które mogą być połączone z programem w celu
zapewnienia dodatkowej funkcjonalności. Jest to najbardziej podstawowa forma wielokrotnego
wykorzystywania kodu, i używana od czasów pierwszych programistów, ryjących zera i jedynki
na ścianach jaskiń.
Kapsułkowanie
Klasy biblioteki iostream postrzegają przepływ danych z programu na ekran jako strumień,
płynący bajt po bajcie. Jeśli punktem docelowym strumienia jest plik lub ekran, wtedy jego
źródłem jest zwykle jakaś część programu. Gdy strumień jest odwrócony, dane mogą pochodzić z
klawiatury lub z dysku i mogą „wypełniać” zmienne w programie.
Jednym z podstawowych zadań strumieni jest kapsułkowanie problemu pobierania danych z
wejścia (na przykład dysku) i wysyłania ich do wyjścia (na przykład na ekran). Po stworzeniu
strumienia program działa z tym strumieniem, przy czym strumień zajmuje się wszystkimi
szczegółami. Tę podstawową ideę ilustruje rysunek 17.1.
Rys. 17.1. Kapsułkowanie poprzez strumienie
Buforowanie
Zapis na dysk (i w mniejszym stopniu także na ekran) jest bardzo „kosztowny.” Zapis danych na
dysk lub odczyt ich z dysku zajmuje (stosunkowo) dużo czasu, a podczas operacji zapisu i odczytu
działanie programu zwykle jest zablokowane. Aby rozwiązać ten problem, strumienie oferują
„buforowanie”. Dane są zapisywane do strumienia, ale nie są natychmiast zapisywane na dysk.
Zamiast tego bufor strumienia wypełnia się danymi; gdy się całkowicie wypełni, dane są
zapisywane na dysk w ramach pojedynczej operacji.
Wyobraźmy sobie wodę wpływającą do zbiornika przez górny zawór i wypełniającą go, lecz nie
wypływającą z niego poprzez dolny zawór. Ilustruje to rysunek 17.2.
Rys. 17.2. Wypełnianie bufora
6144608.003.png 6144608.004.png 6144608.005.png
Gdy woda (dane) całkowicie wypełni zbiornik, zawór się otwiera i cała zawartość gwałtownie
wypływa. Pokazuje to rysunek 17.3.
Rys. 17.3. Opróżnianie bufora
Gdy bufor się opróżni, dolny zawór zostaje zamknięty, otwiera się górny zawór i do zbiornika-
bufora zaczyna napływać woda. Przedstawia to rysunek 17.4.
Rys. 17.4. Ponowne napełnianie bufora
6144608.006.png 6144608.001.png
Często zdarza się, że chcemy wypuścić wodę ze zbiornika jeszcze zanim całkowicie się wypełni.
Nazywa się to „zrzucaniem bufora”. Ilustruje to rysunek 17.5.
Rys. 17.5. Zrzucanie bufora
6144608.002.png
Strumienie i bufory
Jak można było oczekiwać, C++ implementuje strumienie i bufory w sposób obiektowy.
• Klasa streambuf zarządza buforem, zaś jej funkcje składowe oferują możliwość
wypełniania, opróżniania, zrzucania i innych sposobów manipulowania buforem.
• Klasa ios jest bazową klasą dla klas wejścia-wyjścia z użyciem strumieni. Jedną ze
zmiennych składowych tej klasy jest obiekt klasy streambuf .
• Klasy istream i ostream są wyprowadzone z klasy ios i specjalizują działanie strumieni
wejściowych i wyjściowych.
• Klasa iostream jest wyprowadzona zarówno z klasy istream , jak i ostream i dostarcza
metod wejścia-wyjścia do wypisywania danych na ekranie i odczytywania ich z klawiatury.
• Klasa fstream zapewnia wejście i wyjście z oraz do plików.
Standardowe obiekty wejścia-wyjścia
Gdy program C++, zawierający klasę iostream , rozpoczyna działanie, tworzy i inicjalizuje
cztery obiekty:
UWAGA Biblioteka klasy iostream jest dodawana przez kompilator do programu
automatycznie. Aby użyć jej funkcji, musisz dołączyć do początku kodu swojego programu
odpowiednią instrukcję #include .
cin (wymawiane jako „si-in”) obsługuje wprowadzanie danych ze standardowego wejścia,
czyli klawiatury.
cout (wymawiane jako „si-aut”) obsługuje wyprowadzanie danych na standardowe wyjście,
czyli ekran.
cerr (wymawiane jako „si-err”) obsługuje niebuforowane wyprowadzanie danych na
standardowe urządzenie wyjścia dla wydruku błędów, czyli ekran. Ponieważ wyjście błędów
nie jest buforowane, wszystko co zostanie wysłane do cerr , jest wypisywane na
standardowym urządzeniu błędów natychmiast, bez oczekiwania na wypełnienie bufora lub
nadejście polecenia zrzutu.
clog (wymawiane jako „si-log”) obsługuje buforowane wyprowadzanie danych na
standardowe wyjście błędów, czyli ekran. Dość często to wyjście jest przekierowywane do
pliku log dziennika, co zostanie opisane w następnym podrozdziale.
Zgłoś jeśli naruszono regulamin