Narzędzia użytkownika

Narzędzia witryny


klasy_bazowe_dla_strumieni

To jest stara wersja strony!


Klasy bazowe dla strumieni

Wstęp

Strumienie są abstrakcyjnym pojęciem reprezentującym przestrzeń, na której wykonywawane są operacje wejścia i wejścia. Dokładniej, strumień reprezentuje źródło (bądź przeznaczenie) pewnego ciągu znaków o nieokreślonej długości.
Strumienie są zwykle powiązywane z określonym, fizycznym źródłem (bądź przeznaczeniem) ciągu znaków, jak np. plik na dysku, klawiatura czy konsola. Wynika stąd, że operacje na strumieniach są po prostu operacjami wejścia/wyjścia na wymienionych wyżej „fizycznych” urządzeń bądź programów.
Do zarządzania strumieniami w C++ wykorzystuje się standardową bibliotekę iostream.

Hierarchia

Klasa iostream dziedziczy po klasach istream (jej egzemplarzem, standardowo zdefiniowanym, jest strumień wejścia cin) i ostream (strumień wyjścia cout), które z kolei dziedziczą po klasie ios. Klasa ios dziedziczy po klasie basic_os, dla której klasą bazową jest natomiast ios_base;

Klasy

Poniżej został przedstawiony opis klas, po których dziedziczy klasa iostream. Opis nie ma być kopią dokumentacji - jest stworzony, żeby po to, żeby przedstawić funkcjonalność związaną z wykorzystaniem elementów oraz funkcji składowych klas bazowych dla iostream.

ios_base

ios_base (Input Output State) jest podstawową klasą bazową dla pojęcia strumienia i operacji z nim związnych. Dostarcza pojęcie flagi stanu formatowania, a także narzędzi do jego wykorzystania.

Spis omówionych elementów klasy ios_base
ios_base::enum iostate          //typ wyliczeniowy odpowiadający za kategorie błędów stanu strumienia
 
ios_base::skipws                //flagi stanów formatowania
ios_base::left		
ios_base::right		
ios_base::internal	
ios_base::boolalpha
ios_base::dec	
ios_base::oct	
ios_base::hex	
ios_base::showbase
ios_base::showpoint
ios_base::uppercase
ios_base::showpos
ios_base::scientific		
ios_base::fixed 		
ios_base::unitbuf
 
ios_base::adjustfield           ////maski (pola)
ios_base::basefield
ios_base::floatfield
Spis definicji omówionych metod klasy ios_base
ios_base::ftmflags setf(fmtflags flaga)
ios_base::fmtflags setf(ftmflags flaga, fmtflags nazwa_pola)
ios_base::ftmflags unsetf(fmtflags flaga)
ios_base::ftmflags flags(fmtflags flaga)
ios_base::ftmflags flags()
 
ios_base::streamsize width() const;
ios_base::width(streamsize());
ios_base::precision() const;
ios_base::precision(streamsize);
 
ios_base::io_state rdstate()				
ios_base::void clear(io_state = ios::goodbit)
ios_base::void setstate(io_state stan)
Flagi

Flagi są polami zawierającymi informację tak/nie, dotyczącą formatowania.
Istnieje kilka sposób na ustawienie/zdjęć flag :

  1. użycie elementarnych funkcji składowych klasy ios_base służących do ustawiania i kasowania flag, takich jak setf() oraz unsetf().
  2. użycie funkcji składowych z klasy ios, takich jak width() i presision(), które nie ustawiają flag, lecz zmieniają towarzyszące im parametry, takie jak szerokość, prezycja itp., a także funckji składowej klasy basic_os - fill().
  3. użycie manipulatorów (specjalnych sekwencji), które są „wpuszczane” do strumienia i służą jako instrukcja zmiany sposobu formatowania.
Opis flag
ios_base::skipws 

(skip white spaces) ustawienie tej flagi jest sugestią, by przyjmując znaki strumień ignorował ewentualne białe znaki (spacje, tabulatory, znaki nowej linii itp). Jeżeli ta flaga nie jest ustawiona, napotkanie białego znaku będzie równoznaczne z zasygnalizowaniem błedu strumienia. Domyślnie ta flaga jest ustawiona.

ios_base::left		//	\	
ios_base::right		//	=	składniki pola (maski) adjustfield
ios_base::internal	//	/
Trzy powyższe flagi obslugują justowanie. Justowanie polega na tym, że np. jeżeli liczba składająda się z 2 cyfr ma zostac wypisana na obszarze zajmującym 10 znaków, to może zostać wypisana z lewej strony tego obszaru (flata left), z prawej (flaga right), bądź wyśrodkowana (flaga internal). Naturalnym jest, że jednocześnie może być ustawiona tylko jedna flaga odpowiedzialna za justowanie. Domyslnie jest to flaga right.

Przykład (pseudokod, znak _ oznacza puste miejsce)

-42_______		//flaga left
_______-42		//flaga right
-_______42		//flaga internal
ios_base::boolalpha
Włączenie tej flagi powoduje, strumień mający wypisać zawartość zmiennej bool wynoszącą 1 (true) wypisze true, zaś jeżeli zmienna ma wartość 0 (false) strumień wypisze false. Domyślnie flaga jest wyłączona - strumień wypisuje 1 bądź 0.
Podobnie jest przy wczytywaniu do obiektów typu bool - po ustawieniu tej flagi strumień będzie spodziewać się nie liczb 1 lub 0, ale słów true lub false.
ios_base::dec	//	\
ios_base::oct	//	= tworzą maskę (pole) o nazwie basefield
ios_base::hex	//	/
Te trzy flagi decydują o tym, czy wartości liczbowe naszego programu pojawiały się będą na ekranie w postaci dziesiątkowej (dec), szesnastkowej (hex) czy ósemkowej (oct)
Podobnie przy przyjmowaniu liczb (np. z klawiatury). Jeżeli będzie to zapis "101" to strumień może to uznać za liczbę w postaci dziesiątkowej , szesnastkowej bądź ósemkowej.
W jednej chwili tylko jedna flaga może być włączona.
Domyślnie wszystkie trzy flagi są wyłączone. Wówczas stosowana jest notacja dziesiątkowa (dec).
ios_base::showbase
Ustawienie tej flagi odpowiada żądaniu, by liczby całkowite wypisywane były tak, żeby łatwo moża było poznać to, w jakim systemie są one zapisane.
Domyślnie ta flaga nie jest ustawiona.

Przykład w postaci sformatowanej tabelki odpowiadającej sformatowanemu wyjściu:

				hex		oct		dec
	flaga ustawiona 	0xa4c		077		32
	flaga nieustawiona	a4c		77		32
ios_base::showpoint
Przy wypisywaniu liczb zmiennnoprzecinkowych ustawienie tej flagi powoduje, że wypisywane są zawsze nieznaczące zera i kropka dziesiętna. Jeżeli np. obowiązuje dokładność wypisywania do sześciu miejsc po kropce dziesiętnej, to liczby wypisywane są w sposób zgodny z przykładek. Domyślnie flaga ta nie jest ustawiona

Przykład w postaci sformatowanej tabelki :

				double m = 7.14		double n = 4		int k = 4
	flaga ustawiona		7.140000		4.000000		4
	flaga nieustawiona	7.14			4			4
ios_base::uppercase
Ustawienie tej flagi włącza wyświetlanie niektórych formatów liczb z uwzględnieniem powiększenia ilczb oznaczających np. podstawę konsersji 'x' lub wykadnik 'e' w notacji naukowej, czyli np. liczba zapisana w formacie szesnastkowym 0x1a będzie wyświetlana jako 0X1A, zaś liczba 33e-5 będzie wyświetlana jako 33E-5.
Domyślnie ta flaga nie jest ustawiona.
ios_base::showpos
Ustawienie tej flagi powoduje, że przy wypisywaniu dodatnich liczb dziesiątkowych zostaną one poprzedzone znakiem + (plus), np. liczba 107.2 zostanie przedstawiona jako +107.2
Domyślnie ta flaga nie jest ustawiona.

ios_base::scientific obie flagi są sładnikami pola (maski) floatfield ios_base::fixed

Format wypisywanych przez strumień liczb zależy od obowiązującej w danej chwili dokładności. Domniemana wartość tej dokładności to sześć cyfr po przecinku.
Ustawienie flagi fixed sprawia, że liczby rzeczywiste będą wypisywane w postaci liczb dziesiętnych, np. double liczba = 91234567.66666666 zostanie wypisana jako 91234567.66667.
Ustawienie flagi scientific sprawia, że liczby będą wypisaywane w notacji naukowej (wykładniczej), czyli wspomniana powyzej liczba zostanie wypisana jako 9.123457e+007 (akurat obowiązuje zasada sześciu cyfr po przecinku, jako domnienanej dokładności). Strumień sam zaokrągla cechę, konkretnie jej szóste miejsce po przecinku.
Jeżeli nie jest ustawiona żadna z flag, wówczas sposób zastosowany przez strumień do wypisywania liczby zależeć będzie od samej liczby. Mianowicie :
- Gdy wykładnik liczby będzie mniejszy niż -4 bądź większy od obowiązującej dokładności (domyślnie jest to 6) to użyta zostanie opcja wykładnicza.
-W przeciwnym razie używana jest opcja notacji dziesiętnej

iso_base::unitbuf

Ustawienie tej flagi jest rezygnacją z tak zwanego buforowania strumienia. Strumień niebuforowany nie jest tak efektywny, jak buforowany. 
Przez domniemanie ta flaga jest ustawiona.
klasy_bazowe_dla_strumieni.1229123666.txt.gz · ostatnio zmienione: 2008/12/13 00:14 przez siemionides