Podrozdziały
16.1 Strumienie
Operacje we/wy realizuje się w C++ za pomocą
strumieni.
Strumień możemy wyobrażać sobie jako strumień informacji,
w postaci bajtów, płynący od źródła do ujścia.
Zachodzą przy tym dwie możliwości:
- informacja płynie od naszego programu do ujścia.
Ujściem może być terminal, plik, gniazdo internetowe,
obszar w pamięci, nazwany potok, systemowa kolejka FIFO,
modem itd. O takim strumieniu mówimy, że jest strumieniem
wyjściowym
(ang. output stream),
- informacja płynie do naszego programu ze źródła.
Źródłem może być terminal, plik itd.
O takim strumieniu mówimy, że jest strumieniem
wejściowym
(ang. input stream).
Do reprezentowania strumieni i obsługi operacji na nich zdefiniowane
są specjalne klasy wyposażone w pola i metody.
Struktura tych klas jest skomplikowana, ale na szczęście nie
musimy jej dokładnie znać, aby z obiektów tych klas i ich składowych
korzystać.
Ogólny, uproszczony schemat klas przedstawiony jest na rysunku
(klasy
istrstream,
ostrstream
i
strstream, omówione poniżej, nie należą do
tej hierarchii):
Podstawową dla nas klasą jest klasa
ios
(sama wyprowadzona z
ios_base); z niej wyprowadzone są (dziedziczą) klasy:
-
istream
— podstawowa klasa reprezentująca
strumienie wejściowe.
W niej, między innymi, zdefiniowane
jest przeciążenie operatora '>>' i tej właśnie
klasy obiektem jest
cin,
reprezentujący standardowy strumień wejściowy
(znany jako stdin).
Bardziej wyspecjalizowane klasy do obsługi strumieni
wejściowych to:
-
istringstream
— źródłem jest obiekt
klasy
string, czyli napis.
Dostępna po dołączeniu za pomocą dyrektywy
#include pliku
sstream.
-
istrstream
— źródłem jest C-napis
(czyli tablica znaków ze znakiem '
\0' jako
ostatnim). Udostępniana w pliku
nagłówkowym
strstream.
UWAGA: ta klasa nie należy do standardu!
-
ifstream
(z ang. intput file stream)
— źródłem jest plik. Udostępniana
po dołączeniu
fstream.
-
ostream
— podstawowa klasa reprezentująca
strumienie wyjściowe. W niej właśnie zdefiniowane
jest przeciążenie operatora '<<' i obiekty
cout,
reprezentujący standardowy strumień wyjściowy
(zwany stdout) oraz
cerr
i
clog, reprezentujące standardowy
strumień błędów (stderr) niebuforowany
i buforowany, a także manipulatory
endl
i
ends.
Bardziej wyspecjalizowane klasy do obsługi strumieni
wyjściowych to:
-
ostringstream
— ujściem jest obiekt
klasy
string, czyli napis.
Udostępniana
po dołączeniu pliku
sstream.
-
ostrstream
— ujściem jest C-napis, czyli
tablica znaków ze znakiem '
\0' jako ostatnim.
Udostępniana po dołączeniu pliku nagłówkowego
strstream.
UWAGA: ta klasa nie należy do standardu!
-
ofstream
(z ang. output file stream)
— ujściem jest plik.
Udostępniana po dołączeniu pliku nagłówkowego
fstream.
Klasa
iostream, z nagłówka o tej samej nazwie, dziedziczy
zarówno z
istream, jak i z
ostream, zatem
dołączając
iostream
zapewniamy funkcjonalność obu.
Podobnie, dołączając
fstream
zapewniamy dostęp do
klas
ifstream
i
ofstream, a dołączając
sstream
do
istringstream
i
ostringstream.
Generalnie zatem:
- jeśli w naszym programie wykonujemy tylko
konsolowe operacje we/wy (pisanie na ekran, czytanie z
klawiatury), to wystarczy dołączyć plik nagłówkowy
iostream;
- jeśli wykonujemy operacje na plikach, to trzeba
włączyć plik nagłówkowy
fstream;
- jeśli wykonujemy operacje we/wy, dla których źródłem lub
ujściem są obiekty klasy
string, to należy
dołączyć
sstream.
- jeśli wykonujemy operacje we/wy, dla których źródłem lub
ujściem są C-napisy, to należy
dołączyć
strstream.
16.1.1 Strumienie predefiniowane
Po dołączeniu pliku nagłówkowego
iostream
mamy do dyspozycji cztery już otwarte strumienie:
jeden wejściowy —
cin, i trzy wyjściowe —
cout,
cerr
i
clog.
Nazwy te są w rzeczywistości nazwami obiektów reprezentujących
strumienie; dlatego, jak się przekonamy, można na ich rzecz
wywoływać metody. Predefiniowane strumienie to:
-
cin
—
standardowy strumień wejściowy.
Źródłem jest standardowy strumień wejściowy
(stdin)
przydzielony procesowi wykonującemu program przez system
operacyjny; zwykle jest to klawiatura, ale można to zmienić.
-
cout
—
standardowy strumień wyjściowy.
Ujściem jest standardowy strumień wyjściowy
(stdout)
przydzielony procesowi wykonującemu program przez system
operacyjny; zwykle jest to ekran terminala, ale często jest
przekierowywany do pliku. Strumień ten
jest buforowany, a więc wpisane tam znaki mogą
pojawiać się na ekranie z opóźnieniem, albo w ogóle
się nie pojawić, jeśli program zakończył się
przedwcześnie i bufor wyjściowy nie zdążył zostać
opróżniony.
-
cerr
—
standardowy strumień komunikatów o błędach.
Ujściem jest standardowy strumień komunikatów
o błędach
(stderr),
przydzielony procesowi wykonującemu program przez system
operacyjny; zwykle jest to ekran terminala. Strumień ten
nie jest buforowany, a więc wpisane tam znaki
powinny ukazać się na ekranie natychmiast i być widoczne
nawet jeśli zaraz potem program załamie się.
-
clog
—
to również strumień związany z
stderr, tyle,
że buforowany.
Ze wszystkich tych strumieni można korzystać w znany nam już sposób
z użyciem operatorów '<<' (wyjście, czyli pisanie)
lub '>>' (wejście, czyli czytanie).
Można używać też metod, które będą opisane w dalszym ciągu
tego rozdziału.
T.R. Werner, 21 lutego 2016; 20:17