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
klasy_bazowe_dla_strumieni [2008/12/14 20:29]
siemionides
klasy_bazowe_dla_strumieni [2008/12/14 21:23] (aktualna)
siemionides
Linia 397: Linia 397:
 ==== Klasa 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 471: Linia 473:
 Pobiera (n-1) znakow ze strumienia wejsciowego badz pobiera je do momentu napotkania znaku ogranicznika delim i lokuje je do tablicy rozpoczynajacej sie s. 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>+<code cpp>
 //przyklad //przyklad
 void uzyj_getline_gcout() void uzyj_getline_gcout()
Linia 480: Linia 482:
  cout << tab << endl <<"​A operowales przed chwila na ilosci znakow wynoszacej :  " << cin.gcount() << endl;  cout << tab << endl <<"​A operowales przed chwila na ilosci znakow wynoszacej :  " << cin.gcount() << endl;
 } }
-</copy>+</code>
  
  
Linia 493: Linia 495:
 Pobiera ze strumienia wejsciowego ilosc znakow podana przez argument n i pomija je. Pobieranie zatrzymuje sie w momencie napotkania na znak ogranicznika delim. 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>+<code cpp>
 //​przyklad ​ //​przyklad ​
 char first, last; char first, last;
Linia 505: Linia 507:
  
 cout << "Twoje inicjaly to  " << first << last << endl; cout << "Twoje inicjaly to  " << first << last << endl;
-</copy>+</code>
  
  
Linia 514: Linia 516:
 Odczytuje i zwraca kolejny znak ze strumienia, bez usuwania go stamtąd. Odczytuje i zwraca kolejny znak ze strumienia, bez usuwania go stamtąd.
  
-<copy cpp>+<code cpp>
 //przyklad //przyklad
 char c; char c;
Linia 531: Linia 533:
   cout << " Wpisales slowo " << str << endl;   cout << " Wpisales slowo " << str << endl;
 } }
-</copy>+</code>
  
  
Linia 541: Linia 543:
 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();​ 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>+<code cpp>
 //przyklad //przyklad
 char napis[10]; char napis[10];
Linia 555: Linia 557:
  
 return 0; return 0;
-</copy>+</code>
  
  
Linia 589: Linia 591:
 ==istream::​istream & unget()== ==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();​ 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