Narzędzia użytkownika

Narzędzia witryny


klasy_bazowe_dla_strumieni

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
klasy_bazowe_dla_strumieni [2008/12/13 17:17]
siemionides
klasy_bazowe_dla_strumieni [2008/12/14 20:29]
siemionides
Linia 15: Linia 15:
  
  
-=== ios_base ====+==== Klasa 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. ​ 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. ​
  
Linia 106: Linia 106:
 Przykład w postaci sformatowanej tabelki odpowiadającej sformatowanemu wyjściu:\\ Przykład w postaci sformatowanej tabelki odpowiadającej sformatowanemu wyjściu:\\
 <code cpp> <code cpp>
- hex oct dec + hex oct dec 
- flaga ustawiona 0xa4c 077 32 +flaga ustawiona 0xa4c 077 32 
- flaga nieustawiona a4c 77 32+flaga nieustawiona a4c 77 32
 </​code>​ </​code>​
   
Linia 118: Linia 118:
  
 <code cpp> <code cpp>
- double m = 7.14 double n = 4 int k = 4 + double m = 7.14 double n = 4 int k = 4 
- flaga ustawiona 7.140000 4.000000 4 +flaga ustawiona 7.140000 4.000000 4 
- flaga nieustawiona 7.14 4 4+flaga nieustawiona 7.14 4 4
 </​code>​ </​code>​
  
Linia 153: Linia 153:
  
 ==ios_base::​adjustfield== ==ios_base::​adjustfield==
-Ta maska (pole) odpowiada za zagadnienie justowania, reprezentuje trzy wspomniane już flagi:+Ta maska (pole) odpowiada za zagadnienie justowania, reprezentuje trzy wspomniane już flagi:\\
 ''​ ''​
 ios_base::​left /​ /    justowanie lewe \\ ios_base::​left /​ /    justowanie lewe \\
Linia 162: Linia 162:
  
 ==ios_base::​basefield== ==ios_base::​basefield==
-Ta maska (pole) odpowiada za zagadnienia typu konwersji, reprezentuje flagi: +Ta maska (pole) odpowiada za zagadnienia typu konwersji, reprezentuje flagi:\\ 
--ios_base::​dec //​konwersja decymalna  +''​ 
--ios_base::​oct //​konwersja oktalna +ios_base::​dec /​ /    konwersja decymalna\\  
--ios_base::​hex //​konwersja heksadecymalna+ios_base::​oct /​ /    konwersja oktalna\\ 
 +ios_base::​hex /​ /    konwersja heksadecymalna 
 +''​ 
 + 
 +==ios_base::​floatfield== 
 +Ta maska (pole) odpowiada za typ notacji, reprezentuje flagi:\\ 
 +''​ 
 +ios_base::​scientific /​ /    notacja naukowa (wykładnicza)\\ 
 +ios_base::​fixed  ​       / /    notacja zwykla 
 +''​ 
 + 
 + 
 + 
 +=== Opis metod klasy ios_base === 
 + 
 +==ios_base::​fmtflags setf(fmtflags ktore_flagi)== 
 +Funkcja ta umożliwia ustawienie w słowie stanu tych flag, które przysłaliśmy we wzorze jako argument. Funkcja, jako rezultat, zwraca dotychczasowy stan wszystkich flag formatowania. \\ 
 +Typ fmtflags jest typem flag w klasie ios_base, poglądowo można śmiało przyjąć, że jest to inna nazwa na typ int, zaś poszczególne flagi są bitami wchodzącymi w skład tego typu.\\ 
 +  
 +<code cpp> 
 +//​przykład 
 +cin.setf(ios::​skipws);​ // ustawia flagę skipws odpowiadającą za ignorowanie białych znaków  
 + // przez strumień wejściowy cin. Inne flagi pozostają bez zmian. 
 +cin.setf(ios::​skipws | ios::​boolalpha) // ustawia jednocześnie obie flagi 
 +</​code>​ 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +==ios_base::​fmtflags setf(ftmflags flaga, fmtflags nazwa_pola)== 
 +Funkcją można szybko ustawić flagę należącą do grupy flag zwanej "​maską"​ bądź "​polem"​. Istnieją trzy maski (opis niżej). Jedna z nich, odpowiadająca konwersji liczb to ios_base::​basefield,​ w której skład wchodzą flagi ios_base::​dec,​ ios_base::​hex,​ ios_baze::​oct. Flagi wchodzące w skład danej "​maski"​ muszą być ustawione jako jedyne w grupie. \\ 
 +Np. mając strumień wypisujący dane w zapisie szesnastkowym,​ a chcąc, żeby wypisywał w zapisie dziesiątkowym,​ możemy zrobić np. tak \\ 
 + 
 +<code cpp> 
 +//​przykład 
 +cout.setf(ios_base::​dec);​ 
 +cout.unsetf(ios_base::​hex);​ 
 +</​code>​ 
 +\\ 
 +bądź, z wykorzystaniem funkcji setf(flaga, nazwa_pola) : 
 + 
 +<code cpp> 
 +//​przykład 
 +cout.setf(ios_base::​dec,​ ios_base::​basefield);​ //​ ustawia flagę ios_base::​dec,​ dbając o 
 +                                                // wyłączenie pozostałych flag wchodzących  
 +                                                // w skład pola ios_base::​basefield 
 +</​code>​  
 + 
 + 
 + 
 +Dodatkowo, omawianą funkcją można skasować wszystkie flagi należące do tego pola, powracajac do sytuacji domniemanej. Robi się to podając jako pierwszy argument wartość zero. 
 + 
 +<code cpp> 
 +//​przykład 
 +cout.setf(0,​ ios::​basefield);​ //​ skasowanie wszystkich flag 
 +</​code>​ 
 + 
 + 
 + 
 + 
 + 
 + 
 +==ios_base::​fmtflags unsetf(fmtflags flagi)== 
 +Funckja ta jako rezultat zwraca wartość typu fmtflags opisującą dotychczasowy stan wszystkich flag formatowania. Funkcja ta sprawia, że wybrana flaga zostaje skasowana (zdjęta), a inne zaś nietknięte. 
 + 
 +<code cpp> 
 +//​przykład 
 +cin.unsetf(ios::​skipws);​ //​skasowanie flagi ios::​skipws 
 +</​code>​ 
 +  
 + 
 + 
 +==ios_base::​fmtflags flags(fmtflags zestaw)== 
 +Funkcja, jako rezultat, zwraca wartość typu fmtflags, obrazującą dotychczasoy stan wszystkich flag formatowania.\\ 
 +Jako argument przyjmuje zestaw funkcji, który można podać za pomocą OR-owania kilku flag. Ustawia wówczas te flagi, które mają byc ustawione (obecne w zestawie), zerując zaś pozostałe zdejmuje.\\ 
 +Główna różnica pomiędzy funkcją flags() a funkcjami setf() oraz unsetf() jest taka, że flags() wpływa na pozostałe flagi, nie tylko na te podane jako argument zestaw (pozostałe są wyłączana) 
 + 
 +<code cpp> 
 +//​przykład 
 +cin.flags(ios_base::​skipsw) // zdejmuje wszystkie flagi, ustawia tylko flagę  
 +                                // ios_base::​skipsw  
 +</​code>​ 
 + 
 + 
 + 
 + 
 + 
 + 
 +==ios_base::​fmtflags flags()== 
 +Zwraca wartość typu ftmflags zawierającą informację o wszystkich obecnie używanych flagach. Przydatne do sprawdzenia ustawienie jednej flagi bądź zapisu ustawień, celem późnniejszego do nich powrotu. 
 + 
 +<code cpp> 
 +//​przykład1 
 +if(cout.flags() & ios_base::​fixed) 
 + cout << "Flaga fixed jest ustawiona!";​ 
 +</​code>​ 
 + 
 +<code cpp> 
 +//​przykład2 
 +ftmflags stare_ustawienia = cout.flas();​ // zapisuje ustawienia flag strumienia cout 
 +  
 +cout.setf(ios_base::​fixed);​ 
 +cout.setf(ios_base::​skipsw);​ //​ włączenie różnych flag 
 +// ... 
 + 
 +cout.flags(stare_ustawienia) //​ przywrocenie poprzednich ustawien 
 +</​code>​ 
 + 
 + 
 +==ios_base::​streamsize width() const== 
 +Funkcja ta zwraca obowiązującą właśnie szerokość pola, na którym wypisywana jest ze strumienia jakaś liczba. 
 + 
 + 
 +==ios_base::​width(streamsize())== 
 +Funkcja określa minimalną szerokość pola, na którym ma być wypisana dana liczba.\\ 
 +Określenie tej liczby dotyczy tylko najbliższej operacji we/wy związanej ze strumieniem,​ dla którego zostaje ona podana. 
 + 
 +<code cpp> 
 +//​przykład 
 +int liczba = 107; 
 +cout << "​Wypisz:​ " << liczba << "​\nWypisz:";​ 
 +cout.width(7);​ //​określenie nowej szerokości pola liczby 
 +cout << liczba << ":"​ << endl; 
 +</​code>​ 
 + 
 +Po uruchomieniu tego przykładu na ekranie pojawi się 
 + 
 +<code cpp> 
 +//​przykład  
 +Wypis:​107:​ 
 +Wypis: ​   107: 
 +</​code>​ 
 + 
 +W przypadku wczytywania danych ustawienie szerokości funkcją width() nie ma wpływu na wczytywane liczby, zaś zmieni sposób wczytywania ciągu znaków (tekstu). Dzięki temu można np. zapobiec przekroczeniu rozmiaru tablicy przeznaczonej do przyjęcia znaków, jak w poniższym przykładzie : 
 + 
 +<code cpp> 
 +//​przykład 
 +char napis[7]; 
 +cin.width(sizeof(napis));​ //​ określenie szerokości (długości) pobieranego ciągu znaków 
 + 
 +cin >> napis; 
 +</​code>​ 
 + 
 +Warto zauważyć, że w powyższym przykładzie zostanie wczytanych 6 znaków, a nie 7, ponieważ C-stringi (char napis[7]) muszą posiadać na końcu znak null, który jest tam automatycznie dodawany. 
 + 
 + 
 + 
 +==ios_base::​streamsize precision() const== 
 +Funkcja ta zwraca obecną dokładność wypisywania liczb zmiennoprzecinkowych.\\ 
 +Domyślnie ta dokładność wynosi 6.\\ 
 + 
 +Uwaga. Patrz flagi ios_base::​fixed oraz ios_base:​scientific 
 + 
 + 
 + 
 + 
 +==ios_base::​streamsize precision(streamsize)== 
 +Funkcja ta przyjmuje jako argument wartość streamsize (przyjmijmy,​ że jest to inna nazwa typu int), która oznacza nową dokładność wypisywania liczb zmiennoprzecinkowych. Zwracana wartość jest równa starszej, zastępowanej dokładności wypisywania liczb zmiennoprzecinkowych. 
 + 
 +<code cpp> 
 +//​przykład 
 +double x = 72.123456789;​ 
 + y = 10.55; 
 + z = 2; 
 +  
 +cout << "​Obecna dokładność = " << (cout.precision()) << endl; 
 +cout << "​Domniemany : " << "​x="​ << x << " y=" << y << " z=" << z << endl; 
 + //​Wypisze x=72.1235 y=10.55 z=2 
 +cout.precision(2);​ 
 +cout << "Po zmianie : " << "​x="​ << x << " y=" << y << " z=" << z << endl; 
 + //​Wypisze x=72 y=11 z=2  
 +</​code>​ 
 + 
 + 
 + 
 + 
 +==== Klasa basic_os ==== 
 +Klasa dziedzicząca po ios_base. 
 + 
 +=== Spis omówionych definicji metod klasy basic_os === 
 +''​ 
 +basic_os::​char fill(char c)\\ 
 +basic_os::​char fill()\\ 
 + 
 +basic_ios:: bool good() / /opis we flagach stanów \\ 
 +basic_ios::​bool eof()\\ 
 +basic_ios::​bool fail()\\ 
 +basic_ios::​bool bad()\\ 
 +''​ 
 +=== Omówienie metod klasy basic_os === 
 +==basic_os::​char fill(char c)== 
 +Funkcja ta zmienia znak wypełniający miejsce pozostale przy wypisywaniu liczby na pole o większej ilości znaków, niż długość liczby, np. liczba jest dwucyfrowa, a ma byc wypisana na 7 miejscach (zostało to ustalone za pomocą, więc pozostale miejsca są domyslnie wypełniane spacjami. Nowy znak dopełniający miejsce w takich przypadkach jest właśnie argumentem tej funkcji. \\ 
 +Wartość zwracana jest wypełniającym znakiem, obowiązującym do momentu wywołania tej funkcji.\\ 
 + 
 +<code cpp> 
 +int liczba = 1024; 
 +cout.width(9);​ 
 +cout.fill('​*'​);​ 
 +cout << "​Liczba:"​ << liczba << ":"​ << endl;  
 +</​code>​ 
 +Wywolanie powyższego przykładu zaowocuje pojawieniem się na ekranie następującej sekwencji 
 +<code cpp> 
 +Liczba:​*****1024:​ 
 +</​code>​ 
 + 
 + 
 + 
 + 
 + 
 + 
 +==basic_os:​char fill()== 
 +Funkcja ta zwraca znak używany obecnie jako wypełnienie pozostałego miejsca przy wypisywaniu liczby na pole o większej ilości znaków niż długość liczby. 
 + 
 +  
 +==== Klasa ios ==== 
 +Klasa dziedzicząca po basic_ios.\\ 
 + 
 + 
 +=== Spis omówionych elementów składowych === 
 +''​ 
 +ios::​goodbit\\ 
 +ios::​eofbit\\ 
 +ios::​badbit\\ 
 +ios::​failbit\\ 
 +''​ 
 +==== Klasa istream ==== 
 + 
 +=== Spis omówionych definicji metod klasy istream === 
 +''​ 
 +istream::​int get()          \\ 
 +istream::​istream&​ get (char& c) \\ 
 +istream::​istream&​ get(char* s, streamsize n) \\ 
 +istream::​istream&​ get (char* s, streamsize n, char delim)\\ 
 + 
 +istream::​istream&​ getline (char* s, streamsize n )      \\ 
 +istream::​istream&​ getline (char* s, streamsize n, char delim ) 
 +istream::​streamsize gcount() const            \\ 
 +istream::​istream& ​ ignore ( streamsize n = 1, int delim = EOF ) \\ 
 +istream:: int peek() \\ 
 +istream::​istream & read (char *gdzie, streamsize n)\\ 
 +istream::​stremsize readsome(char* s, streamsize n)\\ 
 +istream::​istream & putback(char c) \\ 
 +istream::​istream & unget()\\ 
 +''​ 
 + 
 +=== Omówienie metod klasy istream === 
 + 
 +== istream::​int get() == 
 +Pobiera jeden znak ze strumienia i zwraca jego wartosc rzutowana na typ integer. 
 + 
 +<copy cpp> 
 +//​przyklad 
 +char c, str[256]; 
 +ifstream is; 
 + 
 +cout << "Wpisz nazwe pliku istniejacego w biezacym katalogu";​ 
 +cin.get (str,​256);​ 
 + 
 +is.open (str); ​       // otwieranie pliku 
 + 
 +while (is.good()) ​    // petla trwajaca ile sie da 
 +
 +  c = is.get(); ​      // pobierza znak z pliku 
 +  cout << c; 
 +
 + 
 +is.close(); ​          // zamykanie pliku 
 +</​copy>​ 
 + 
 +== istream::​istream&​ get (char& c) == 
 +Pobiera ze strumienia jeden znak i przechowuje go w zmiennej, do ktorej zostala podana referencja c. 
 + 
 + 
 +==istream&​ get(char* s, streamsize n)== 
 +Pobiera ze strumienia n-1 znakow badz pobiera je do momentu wystapienia znaku  ogranicznika (domyslnie znak konca wiersza '​\n'​) i lokuje je do tablicy rozpoczynającej się s. w momencie natrafienia na znak ogranicznika,​ jest on automatycznie dodawany do tablicy s. 
 + 
 + 
 +==istream&​ get (char* s, streamsize n, char delim)== 
 +Podobnie jak wyżej, z tymże przyjmuje znak ogranicznika w argumencie delim. 
 + 
 + 
 +==istream&​ get(streambuf&​ sb)==  
 +Pobiera ze strumienia znaki i lokuje je w buforze strumieniowym sb do momentu napotkania znaku ogranicznika (domyslnie znak konca wiersza '​\n'​) badz znaku konca pliku. 
 + 
 + 
 +==istream&​ get(streambuff&​ sb, char delim)== 
 +Podobnie jak wyżej, z tymże przyjmuje znak ogranicznika w argumencie delim. 
 + 
 + 
 + 
 + 
 + 
 + 
 + 
 +==istream&​ getline (char* s, streamsize n )== 
 +Pobiera (n-1) znakow ze strumienia wejsciowego i lokuje je do tablicy rozpoczynajacej sie s. 
 + 
 + 
 +==istream&​ getline (char* s, streamsize n, char delim )== 
 +Pobiera (n-1) znakow ze strumienia wejsciowego badz pobiera je do momentu napotkania znaku ogranicznika delim i lokuje je do tablicy rozpoczynajacej sie s. 
 + 
 +<copy cpp> 
 +//​przyklad 
 +void uzyj_getline_gcout() 
 +
 + char tab[10]; 
 + cout << "Podaj tekst o dlugosc do 10 znakow :" << endl; 
 + cin.getline(tab,​ 10); 
 + cout << tab << endl <<"​A operowales przed chwila na ilosci znakow wynoszacej :  " << cin.gcount() << endl; 
 +
 +</​copy>​ 
 + 
 + 
 +==istream::​streamsize gcount() const== 
 + 
 +Zwraca ilość znaków wyciągniętych ze strumienia wejściowego podczas istotniej operacji pobrania z niego niesformatowanych danych. 
 + 
 +Przyklad powyzej, z getline() 
 + 
 + 
 +==istream::​istream& ​ ignore ( streamsize n = 1, int delim = EOF )== 
 +Pobiera ze strumienia wejsciowego ilosc znakow podana przez argument n i pomija je. Pobieranie zatrzymuje sie w momencie napotkania na znak ogranicznika delim. 
 + 
 +<copy cpp> 
 +//przyklad  
 +char first, last; 
 + 
 +cout << "Podaj imie i nazwisko: "; 
 + 
 +first=cin.get();​ 
 +cin.ignore(256,'​ '); 
 + 
 +last=cin.get();​ 
 + 
 +cout << "Twoje inicjaly to  " << first << last << endl; 
 +</​copy>​ 
 + 
 + 
 + 
 + 
 +==istream:: int peek()== 
 + 
 +Odczytuje i zwraca kolejny znak ze strumienia, bez usuwania go stamtąd. 
 + 
 +<copy cpp> 
 +//​przyklad 
 +char c; 
 +int n; 
 +char str[256]; 
 + 
 +cout << "Wpisz liczbe lub slowo: "; 
 +c=cin.peek();​ 
 + 
 +if ( (c >= '​0'​) && (c <= '​9'​) ) 
 +
 +  cin >> n; 
 +  cout << "​Wpisales liczbe ​ " << n << endl; 
 +}else{ 
 +  cin >> str; 
 +  cout << " Wpisales slowo " << str << endl; 
 +
 +</​copy>​ 
 + 
 + 
 + 
 + 
 +==istream::​istream & read (char *gdzie, streamsize n)== 
 + 
 +Domeną zastosowań tej funkcji są binarne operacje wejścia - wyjścia. Wczytuje ona ze strumienia n znakow i umieszcza je do tablicy, której pierwszy element znajduje się pod adresem gdzie. Nie interesuje jej, czy wczytujemy dane binarne czy teksty. Niezależnie od tego, czy ze strumienia wyjmowane będą znaki alfanumeryczne,​ czy też znaki nowej linii, czy końca pliku - będą one umieszczane we wskazanym miejscu pamięci. Nadaje się np. do wczytywania danych binarnych z pliku dyskowego. 
 +W czasie przesyłania znaków ze strumienia może nastąpić bład - np. zażądaliśmy wczytania 50 znaków, a jest ich w strumieniu tylko 30. Zapali się wówczas flaga ios::​eofbit. Żeby sprawdzić, ile znakow zostało wczytanych, warto użyć funkcji istream::​gcount();​ 
 + 
 +<copy cpp> 
 +//​przyklad 
 +char napis[10];​ 
 + 
 +for(int i = 0; i <10; i++) napis[i] = '​0';​ //"​czyszczenie"​ tablicy 
 + 
 +cout << "​Zawartosc tablicy przed : " << napis << endl; 
 +cout << "​Wczytam tylko 4 bajty, napisz cos : "; 
 + 
 +cin.read(napis,​ 4); 
 + 
 +cout << "​Wczytane bajty : " << napis << endl; 
 + 
 +return 0; 
 +</​copy>​ 
 + 
 + 
 + 
 +==istream::​stremsize readsome(char* s, streamsize n)== 
 +Działa podobnie jak funkcja read(), z tymże jeżeli znaków w strumieniu jest mniej, niż zażądaliśmy,​ to wczytuje tylko tyle, ile ich jest, bez sygnalizacji błędu.\\ 
 +Zwraca ilość wczytanych znaków. Jeżeli bufor jest pusty, nic nie wczytuje i zwraca zero. 
 +  
 + 
 + 
 +==istream::​istream & putback(char c)== 
 +Pozwala na włożenie z powrotem do strumienia znaku, który został z niego wyjęty. 
 +Wartym odnotowania jest fakt, że standard nie definiuje tego, co by się stało gdybyśmy spróbowali wrzucić do strumienia inny znak, niż został przed chwilą z niego wyczytany. 
 + 
 +<code cpp> 
 +//​przyklad 
 +char c,z; 
 + 
 +cin >> c; 
 + 
 +cout << "​Przeczytany c=" << c << endl; 
 + 
 +cin.putback(c);​ 
 +cin >> z; 
 + 
 +cout << "​Przeczytany z=" << z << endl; 
 + 
 +return 0; 
 + 
 +</​code>​ 
  
-ios_base::floatfield +==istream::istream & unget()== 
- Ta maska (poleodpowiada za typ notacji, reprezentuje flagi: +Rożni się od funkcji istream::putback() tym, że przyjmuje znaku, który trzeba włożyć z powrotem"​ do struminia ​powinien on być automatycznie rozpoznany przez strumień, przez co jest bezpieczniejsza,​ niż istream::putback();
- -ios_base::scientific //​notacja naukowa ​(wykładnicza) +
- -ios_base::fixed //​notacja zwykla+
  
  
klasy_bazowe_dla_strumieni.txt · ostatnio zmienione: 2008/12/14 21:23 przez siemionides