Strumienie danych
C++ zawiera bibliotekę iostream.h, którą jest dołączona do wszystkich przykładów, w która służy do obsługi wejścia wyjścia, w oparciu o klasę obiektów.
Strumień jest abstrakcyjnym modelem urządzenia wejścia wyjścia, takiego jak plik, ekran, klawiatura a nawet bufor w pamięci. Jest on tym pomiędzy programem a plikiem czy klawiaturą, czym sterownik dla wIndowsa pomiędzy systemem a jakimś urządzeniem, np kartą graficzną. Program nie jest zainteresowany jaki ty masz monitor, czy do którego pliku on zapisuje. O to martwi się strumień, i ewentualnie informuje nas o błędach.
Biblioteka iostream.h zawiera 4 podstawowe strumienie:
cin - strumień wejściowy przyłączony do standardowego urządzenia wejścia (klawiatura),
cout - strumień wyjściowy przyłączony do standardowego urządzenia wyjścia (ekran),
cerr - strumień wyjściowy do nie buforowanego wyjścia dla standardowego reagowania na błędy,
clog - w pełni buforowany strumień, taki jak cin i cout, podobny do cerr.
Zamiast definicji funkcji składowych do realizacji wejścia, wyjścia biblioteka iostream.h zawiera operatory oznaczających przesłanie danych na wejście i wyjście. W C++ >> jest operatorem wejścia a << jest operatorem wyjścia. Zresztą to widać podczas pisania programu jeżeli chcemy wysłać do strumienia wartość zmiennej to piszemy:
cout << zmienna;
Czyli przesyłamy dane ze zmiennej w kierunku strumienia, tak jak byśmy rysowali strzałkę. Jeżeli pobieramy wartość ze strumienia i zapisujemy ją do zmiennej to piszemy:
cin >> zmienna;
Myślę że to widać.
Operatory te umożliwiają przy użyciu jednej składni można wysyłać lub pobierać ze strumienia kilka wartości. Np:
cout << "Wartość zmiennej: " <<zmienna;
Za pomocą powyższego polecenia wysyłamy do strumienia string oraz wartość jakiejś tam zmiennej.
Oba operatory przekształcają tekst na odpowiedni typ zmiennych i odwrotnie, w zależności jaki typ został zastosowany.
Pewnie nasuwa ci się pytanie co to jest bufor. Jest to takie miejsce gdzie komputer gromadzi sobie informacje. Na przykład przy pracy ze strumieniem cout, komputer czeka aż uzbiera mu się trochę znaków w buforze a potem je wyświetla, np całą linię. W tedy program szybciej działa, bo nie musi co chwilę przerywać działania by się zajmować wyświetleniem kolejnego znaku. Strumienie są jednak tak skonstruowane że bufor cout jest czyszczony, czyli wszystkie znaki są wyświetlane jeżeli odwołamy się do cin. Bo skąd ma ktoś wiedzieć co ma wpisać jak komputer nie wyświetlił tego na ekranie?
Manipulatory służą nam do formatowania wyjścia i wejścia. Np standardowo wartość zmiennej np typu int jest wyświetlana w postaci dziesiętnej. Jeżeli chcemy ją wyświetlić w postaci np szesnastkowej to używamy do tego manipulatorów. Oto tabela które je przedstawia:
Manipulator: |
Przykład użycia: |
Działanie: |
dec |
cout << dec << zmienna; |
Przekształca liczby całkowite na ciąg cyfr dziesiętnych podobnie jak format %d w C |
hex |
cout << hex << zmienna; |
Konwersja na układ szesnastkowy, podobnie jak %x w C |
oct |
cout << oct << zmienna; |
Konwersja na układ ósemkowy, podobnie jak %o w C |
ws |
cin >> ws; |
Usuwa spację na strumieniu wejściowym |
endl |
cout << endl; |
Przesyła na strumień wyjścia nową linię i opróżnia bufor. To samo co '\n' w C |
ends |
cout << ends; |
Wstawia znak pusty |
flush |
cout << flush; |
Opróżnia bufor strumienia wyjściowego |
resetiosflags(long) |
cout << resetiosflags(ios::dec); |
Zmienia bity formatu w sposób podany przez argument typu long int (flagę) |
setbase(int) |
cout << setbase(4); |
Ustawia podstawę konwersji na podany argument typu int (0, 8, 10,16) Dla zera ustawia tę podstawę na standardową. |
setfill(int) |
cout << setfill(' '); |
Podaje znak wypełnienia pola do określonej szerokości. |
setiosflags(long) |
cout << setiosflags(ios::dec); |
Ustawia bity formatu w sposób podany poprzez argument typu long int (flagę) |
setprecision(int) |
cout << setprecision(4); |
Ustawia liczbę znaków po przecinku przy konwersji na liczby rzeczywiste |
setw(int) |
cout << setw(4) << zmienna; |
Ustawia szerokość pola na podaną liczbę znaków |
Nazwy flag formatu biblioteki iostream.h
Nazwa flagi: |
Jak działa włączona: |
ios::skipws |
Pomijanie spacji na wejściu |
ios::left |
Wyrównywanie wyjścia dla określonej szerokości pola |
ios::right |
Wyrównywanie wyjścia do prawej |
ios::scientific |
Używanie notacji wykładniczej dla liczb rzeczywistych |
ios::fixed |
Używanie notacji dziesiętnej dla liczb rzeczywistych |
ios::dec |
Używanie postaci dziesiętnej dla liczb całkowitych |
ios::hex |
Używanie postaci szesnastkowej dla liczb całkowitych |
ios::oct |
Używanie postaci ósemkowej dla liczb całkowitych |
ios::uppercase |
Używanie dużych liter na wyjściu dla liczby w postaci szesnastkowej |
ios::showbase |
Wskazuje na podstawę systemu liczenia na wyjściu. Przedrostek 0x dla szesnastkowego i 0 dla ósemkowego |
ios::showpoint |
Liczby zmiennopozycyjne mają kropkę dziesiętną na wyjściu |
ios::showpos |
Liczby dodatnie są wyświetlane wraz ze znakiem + |
ios::unitbuf |
Opróżnianie wszystkich buforów po przesłaniu znaków na strumień |
Manipulator setprecision i flagi scientific, fixed, showpoint służą do formatowania liczb zmiennoprzecinkowych.