Różnice między wybraną wersją a wersją aktualną.
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] 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> | ||
+ | |||
+ | |||