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
klasy_bazowe_dla_strumieni [2008/12/14 20:07]
siemionides
klasy_bazowe_dla_strumieni [2008/12/14 21:23]
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 346: Linia 346:
  
  
-==== basic_os ====+==== Klasa basic_os ====
 Klasa dziedzicząca po ios_base. Klasa dziedzicząca po ios_base.
  
Linia 384: Linia 384:
  
   
-==== klasa ios ====+==== Klasa ios ====
 Klasa dziedzicząca po basic_ios.\\ Klasa dziedzicząca po basic_ios.\\
  
Linia 395: Linia 395:
 ios::​failbit\\ ios::​failbit\\
 ''​ ''​
-==== istream ====+==== Klasa istream ====
  
 +Obiekty klasy ''​istream''​ są strumieniami uzywanymi do odczytu i interpretacji sekwencji znakowych, które pojawiły się na wejściu strumienia (urzadzenia wejścia, dysk twardy, nasłuch poleceń sieciowego protokołu). \\
 +Klasa ''​istream''​ dziedziczy po klasie ''​ios''​ (a przez to po ''​basic_os''​ oraz ''​ios_basse''​.
 === Spis omówionych definicji metod klasy istream === === Spis omówionych definicji metod klasy istream ===
 ''​ ''​
Linia 420: Linia 422:
 Pobiera jeden znak ze strumienia i zwraca jego wartosc rzutowana na typ integer. Pobiera jeden znak ze strumienia i zwraca jego wartosc rzutowana na typ integer.
  
-<copy cpp>+<code cpp>
 //przyklad //przyklad
 char c, str[256]; char c, str[256];
Linia 437: Linia 439:
  
 is.close(); ​          // zamykanie pliku is.close(); ​          // zamykanie pliku
-</copy>+</code>
  
 == istream::​istream&​ get (char& c) == == istream::​istream&​ get (char& c) ==
Linia 451: Linia 453:
  
  
-==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(streambuf&​ sb)==  
-istream&​ get(streambuff&​ sb, char delim) ​- podobnia ​jak wyżej, z tymże przyjmuje znak ogranicznika w argumencie delim.+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. 
 + 
 +<code 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; 
 +
 +</​code>​ 
 + 
 + 
 +==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. 
 + 
 +<code 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; 
 +</​code>​ 
 + 
 + 
 + 
 + 
 +==istream:: int peek()== 
 + 
 +Odczytuje i zwraca kolejny znak ze strumienia, bez usuwania go stamtąd. 
 + 
 +<code 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; 
 +
 +</​code>​ 
 + 
 + 
 + 
 + 
 +==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();​ 
 + 
 +<code 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; 
 +</​code>​ 
 + 
 + 
 + 
 +==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>​ 
 + 
 + 
 +==istream::​istream & unget()== 
 +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();​ 
 + 
 +==== Klasa ostream ==== 
 +Obiekty klasy ''​ostream''​ są  strumianimy używanymi do wypisywania i formatowania sekwencji znakowych na wyjściu strumienia (ekran, plik na dysku itp). 
 + 
 +=== Spis definicji omówionych metod klasy ostream === 
 +''​ 
 +ostream::​ostream & put(char c);\\ 
 +ostream::​ostream & write(const char* s, streamsize n) 
 +''​ 
 + 
 +=== Omówienie metod klasy ostream === 
 + 
 +==ostream::​ostream & put(char c)== 
 +Służy do wstawienia do strumienia pojedynczego znaku c.\\ 
 +Zwraca jako wynik referencję do strumienia wyjsciowego,​ co pozwala na kaskadowe łączenie użycia tej funkcji, jak w przykładzie.\\ 
 +Czasami wstawienie znaków do strumienia może się nie powieść, np. podczas wstawiania znaków do strumienia płynącego do pliku dyskowego - np. dysk uległ zapełnieniu. Wówczas funkcja zwraca, zamiast refencji - zero.\\ 
 +  
 + 
 +<code cpp> 
 +char napis[] = "​kocham zpr";​ 
 +int i = 0; 
 +do{ 
 + cout.put(napis[i]).put('​-'​);​  
 +}while(napis[++i]);​ 
 +</​code>​ 
 +Efektem działania podanego przekładu będzie wyświetlenie na ekranie 
 +<code cpp> 
 +k-o-c-h-a-m- -z-p-r- 
 +</​code>​ 
 + 
 + 
 + 
 +==ostream::​ostream & write(const char* s, streamsize n)== 
 +Funkcja służy do wstawienia do strumienia żądanej liczby bajtów. \\ 
 +Pierwszy argument jest wskaźnikiem do tablicy char, z której mają być pobrane bajty w celu wstawienia ich do strumienia. Drugi argument definiuje liczbę bajtów (począwszy od miejsca wskazywanego wskaźnikiem),​ które mają być wstawione do strumienia.\\ 
 + 
 + 
 +<code cpp> 
 +char napis[] = "​Rembrandt";​ 
 +int i = 0; 
 +  
 +cout.write(napis+3,​ 4) //​wypisze na ekranie "​bran";​ 
 +</​code>​ 
 + 
 + 
 + 
 + 
 +===== Flagi stanu błędów strumienia ===== 
 +W każdym obiekcie klasy IOSTREAM jest znajduje się słowo odpowiadające za stan błedu strumienia. Jeżeli następuje jakiś błąd pracy strumienia - w tym słowie ustawiany jest bit odpowiadający za daną kategorię blędu. Te kategorie błędów określone są typem całkowitym zdefiniowanym w klasie ''​ios_base''​ :  
 + 
 + 
 +==== ios_base::​enum iostate ==== 
 + 
 +''​ 
 +ios_base::​enum iostate\\ 
 +
 + goodbit = 0,\\ 
 + eofbit ​ = 1,\\ 
 + failbit = 2,\\ 
 + ​ badbit ​ = 4\\ 
 +}; 
 +''​ 
 + 
 +=== ios::​goodbit === 
 +Wartość tego bitu wynosi 0, czyli nie jest to żadna flaga błedu. Stan goodbit jest wtedy, kiedy wszystkie pozostałe flagi są wyzerowane. 
 + 
 +=== ios::​eofbit=== 
 +Flaga ta ustawiana jest wtedy, gdy podczas czytania napotkany został koniec pliku (EOF) 
 + 
 +=== ios::​failbit === 
 +Ustawienie tej flagi oznacza, że jakaś operacja we/wy nie powiodła się. Strumień tkwi w stanie błędu, jednak po wyzerowaniu tej flagi nadaje się do pracy. 
 + 
 +=== ios::badbit === 
 +ustawienie tej flagi oznacza, że nastąpił jakiś powazny błąd naruszający budowę samego strumiania. Dalsza praca z tym strumieniem nie jest już możliwa. 
 + 
 + 
 +==== Funkcje do pracy na flagach błędu ==== 
 +Funkcje te są metodami klasy BASIC_IOS, która jest bezpośrednio pochodna po klasie IOS_BASE, zaś jest bazową klasą dla IOS, dlatego każdy obiekt klasy IOSTREAM posiada dostęp do tych funkcji. 
 + 
 +=== Spis definicji omówionych funkcji do pracy na flagach błędu === 
 +''​ 
 +basic_ios:: bool good(); \\ 
 +basic_ios::​bool eof(); \\ 
 +basic_ios::​bool fail();\\ 
 +basic_ios::​bool bad();\\ 
 +''​ 
 + 
 +=== Omówienie funkcji do pracy na flagach błędu === 
 + 
 + 
 +== basic_ios:: bool good() == 
 +Zwraca wartość true, jeżeli wszystko jest w porządku, czyli żaden z bitów błędu nie jest ustawiony, np. 
 +<code cpp> 
 +char znak; 
 +do{ 
 + cin >> znak; 
 + cout << znak;  
 +}while(cin.good());​ 
 +</​code>​ 
 +Powyższa pętla będzie się wykonywała dopóki nie nastąpi błąd strumienia cin. 
 + 
 + 
 + 
 +==basic_ios::​bool eof()== 
 +Zwraca wartość true, jeżeli jest ustawiona flaga IOS::​eofbit,​ czyli przy operacji wczytywania został napotkany koniec pliku, np. 
 + 
 +<code cpp> 
 +char dane[1000];​ 
 +ifstream s("​wtorek.tmp",​ ios::in | ios::​binary);​ //zakladamy istnienie pliku wtorek.tmp w katalogu,  
 +                                                //w ktorym znajduje sie plik wykonywalny 
 +s.read(dane,​ sizeof(dane));​ 
 +if(s.eof()) 
 +  cout << "​Napotakny EOF przed wczytaniem wszystkich danych"​ << endl; 
 +else 
 +  cout << "​Wszystkie dane wczytane O.K" 
 +</​code>​ 
 + 
 + 
 + 
 + 
 +==basic_ios::​bool fail()== 
 +Zwraca wartość true, gdy failbit lub badbit są ustawione.  
 + 
 +<code cpp> 
 +int liczba; 
 +cin >> liczba; 
 +if(cin.fail()) 
 +  cout << "Zle podana liczba !!" << endl; 
 +</​code>​ 
 +Powyższy przykład pozwala na wychwycenie złego (nieoczekiwanego) ciągu znaków w strumieniu, np. tekstu w momencie oczekiwania na liczbę. 
 + 
 + 
 + 
 +==basic_ios::​bool bad()== 
 +Zwraca wartość true, gdy flaga badbit jest ustawiona, czyli w momencie poważnego uszkodzenia strumienia. 
 + 
 + 
 + 
 +===Ręczne ustawianie i kasowanie flag błędu strumienia=== 
 +Robimy to wtedy, gdy sami chcemy zdecydować o tym, co jest popawną, a co niepoprawną operacją we/wy. Przydaje się to w przypadku operacji we/wy z obiektami typu zdefiniowanego przez użytkownika.\\ 
 + 
 + 
 +w klasie IOS_BASE znajdują się następujące funkcje przydatne przy omawianym zagadnieniu : 
 + 
 +''​ 
 +ios_base::​io_state rdstate(); \\ 
 +ios_base::​void clear(io_state = ios::​goodbit);​ \\ 
 +ios_base::​void setstate(io_state stan); \\ 
 +''​ 
 + 
 + 
 +==ios_base::​io_state rdstate()== 
 +Zwraca jako rezultat słowo typu io_state obrazujące stan flag błędu danego strumienia. 
 + 
 +<code cpp> 
 +if(cin.rdstate() & ios:​failbit) 
 +  cout << "Flaga failbit jest ustawiona"​ << endl; 
 +</​code>​ 
 +Potega funkcji rdstate() tkwi w możliwości całościowego poznania biężącego słowa stanu, które następnie można modyfikować,​ np. za pomocą funkcji clear(). 
 + 
 + 
 +==ios_base::​void clear(io_state = ios::​goodbit)== 
 +Działanie tej funkcji jest takie, że argument będący słowem stanu błędów strumienia (io_state) zastępuje całkowicie dotychczasowe słowo stanu błędów strumienia, wszystkie flagi na raz. Wartość domniemana oznacza, że w nowym słowie żadna flaga błędu nie jest ustawiona. 
 + 
 +<code cpp> 
 +//​przyklad 
 +cin.clear(0);​ //​kasuje wszystkie flagi błędu 
 +cin.clear();​ //​kasuje wszystkie flagi błędu 
 +cin.clear(ios::​eofbit);​ //​ustawia w strumieniu cin flagę eofbit, kasując inne 
 +cin.clear(ios::​eofbit | ios::​failbit);//​ ustawia w strumieniu flagi eofbit i  ​   
 +                                    // failbit  
 +</​code>​ 
 + 
 +<code cpp> 
 +//​przyklad2 
 +io_state slowo_stanu;​ 
 +slowo_stanu = wejscie.rdstate();​ //​odczytanie dotychczasowego stanu 
 +  
 +slowo_stanu |= ios::​eofbit;​ //"​dopalenie"​ flagi ios::​eofbit 
 +wejscie.clear(slowo_stanu);​ //"​podrzucenie"​ noweo slowa stanu 
 +</​code>​ 
 +Powyzszy przyklad dokleja flage ''​ios::​eofbit''​ do bieżącego słowa stanu 
 + 
 + 
 +==ios_base::​void setstate(io_state stan)== 
 +Funkcja ta ułatwia "​dopalenie"​ jednej flagi do biężącego słowa stanu. 
 +Jej definicja to: 
 +<code cpp> 
 +//​definicja 
 +void setstate(io_state f) 
 +
 + clear(rdstate() | f); 
 +
 +</​code>​ 
 + 
 + 
 + 
klasy_bazowe_dla_strumieni.txt · ostatnio zmienione: 2008/12/14 21:23 przez siemionides