|
Sponsored link
phi-lab software
|
STL. Strumienie wejscia/wyjscia.
Klasy wejscia/wyjscia nazywane sa biblioteka IOStream.
Jest ona oczywiscie czescia, i to bardzo istotna, biblioteki STL.
Jest ona jedyna czescia biblioteki STL, ktora juz istniala zanim powstala STL.
Biblioteka operacji wejscia/wyjscia byla wczesniej stworzona przez firme AT&T.
Po dokoniu pewnych zmian, zostala zaadoptowana jako czesc skladowa biblioteki standardowej.
W jezyku C++ operacje wejscia/wyjscia wykonywane przy uzyciu strumieni.
Strumien to po prostu obiekt, ktorego wlasnosci okreslone sa przez jego klase.
Juz sama nazwa 'strumien' sugeruje obrazowe wyobrazenie tych operacji.
Cos do strumienia wplywa, i cos z niego wyplywa. Cos wysylamy na jego wejscie,
i cos dostajemy na jego wyjsciu.
Omowie nastepujace tematy:
Klasy strumieni
Klasy wejscia/wyjscia sa na tyle uniwersalne, ze moga dotyczyc roznych urzadzen czy klas. My skoncentrujemy sie na wejsciu z klawiatury i wyjsciu na ekran.
Klasa wejsciowa istream definiuje strumienie, sluzace do odczytu danych (#include <istream>).
Klasa dziedziczy klase podstawowa basic_istream.
Klasa wyjsciowa ostream definiuje strumienie, sluzace do zapisu danych (#include <ostream>).
Klasa dziedziczy klase podstawowa basic_ostream.
Obu klas mozna uzywać osobno, ale nie jest to zbyt wygodne.
Dlatego tez istnieje klasa iostream (#include <iostream>), ktora dziedziczy obie klasy,
udostepniajac nam funkcjonalnosc jednej i drugiej.
Tak wiec dokonujac w swoim programie obu rodzajow operacji wystarczy na poczatku wlaczyc tylko iostream.
Globalne, predefiniowane obiekty strumieni.
#include <iostream>
#include <string>
using namespace std;
int main()
{
int value;
string name = "Bolek";
cout << 5;
cout << name;
cout << "Podaj liczbe: ";
cin >> value;
cout << "Masz " << value << " zl";
return 0;
}
Program ten dziala jak najbardziej prawidlowo. Niestety nie wyglada to na ekranie zbyt dobrze.
Wszystkie operacje << wypisuja kolejne informacje jak leci, jedna za druga.
Malo czytelne. Wyjsciem jest pisanie kolejnych danych w osobnych liniach.
W tym celu wymyslono manipulator o nazwie endl (end of line),
ktory po wyslaniu do strumienia symbolizuje rzadanie przejscia do nastepnej linii.
Czyli program powinien wygladac tak:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int value;
string name = "Bolek";
cout << 5 << endl;
cout << name << endl;
cout << "Podaj liczbe: ";
cin >> value;
cout << "Masz " << value << " zl" << endl;
return 0;
}
Zamiast endl do strumienia mozna przeslac znane z C "\n". Efekt bedzie taki sam.#include <stdio.h> ... printf( "%s %d %s\n", "Masz ", 5, "zlotych" ); ...Jak widac, na naszej glowie bylo wskazanie co chcemy wyswietlic. Czy to liczbe - '%d', czy to tekst - '%s'. C++ jest bardziej inteligentny, sam sie domysla co chcemy wyswietlic.
Operatory wyjscia typow wbudowanych.
Klasa ostream ma tak zdefiniowany operator <<, aby obslugiwala typy tzw. wbudowane.
basic_ostream& operator<<( short n );
basic_ostream& operator<<( int n );
basic_ostream& operator<<( long n );
basic_ostream& operator<<( unsigned short u );
basic_ostream& operator<<( unsigned int u );
basic_ostream& operator<<( unsigned long u );
basic_ostream& operator<<( float f );
basic_ostream& operator<<( double f );
basic_ostream& operator<<( long double f );
basic_ostream& operator<<( bool n );
basic_ostream& operator<<( const void* p );
basic_ostream& put( char c );
basic_ostream& write( const char* p, streamsize n );
Wyslanie do strumienia wskaznika 'void*' nie spowoduje wyprowadzenie na ekran zawartosci
przez niego wskazywanej, ale wartosc jego adresu.
Wartosci logiczne (typu bool) false i true, sa wyswietlane na ekranie jako 0 i 1.
Jesli chcesz na ekranie otrzymać wartosci w postaci napisow, musisz zastosować flage formatujaca boolalpha.
Sprawdzmy to uruchamiajac nastepujacy program:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << true << ' ' << false << endl;
cout << boolalpha;
cout << true << ' ' << false << endl;
}
W pierwszej linii zostana wyswietlone liczby: 1 0.true false.
Operatory wejscia typow wbudowanych.
Klasa istream ma tak zdefiniowany operator >>, aby obslugiwala typy tzw. wbudowane.
basic_istream& operator>>( short& n );
basic_istream& operator>>( int& n );
basic_istream& operator>>( long& n );
basic_istream& operator>>( unsigned short& u );
basic_istream& operator>>( unsigned int& u );
basic_istream& operator>>( unsigned long& u );
basic_istream& operator>>( float& f );
basic_istream& operator>>( double& f );
basic_istream& operator>>( long double& f );
basic_istream& operator>>( bool& n );
basic_istream& operator>>( void*& n );
W celach diagnostycznych dostepne sa tzw. znaczniki stanu strumienia.
Pozwalaja one okreslic czy strumien napotkal jakies problemy, czy nadaje sie
do dalszej pracy czy tez nalezy podjac jakies specjalne dzialanie.
Znaczniki sa typu iostate, stanowiacego skladowa klasy ios_base.
Jaki to jest konkretnie typ (czy typ wyliczeniowy, czy typ calkowity, czy egzemplarz klasy
bitset) nie jest okreslone przez standard C++. Zalezy on od konkretnej
implementacji biblioteki STL.
| Znacznik | Znaczenie |
|---|---|
goodbit |
Operacja wykonana poprawnie. |
eofbit |
Zostal napotkany znacznik konca pliku. |
failbitt |
Blad: operacja zakonczyla sie niepowodzeniem. |
badbit |
Blad krytyczny: strumien w obecnym stanie nie nadaje sie do dalszej pracy. |
Tak naprawde znaczniki istotna role graja przy pracy ze strumieniami zwiazanymi z plikami.
Aby uzytkownik nie musial badac poszczegolnych znacznikow (bitow), udostepniono funkcje,
ktore informuje o stanie konkretnych znacznikow.
| Funkcja skladowa | Znaczenie |
|---|---|
bool good() const; |
Zwraca true jesli wszystko jest w porzadku (goodbit). |
bool eof() const; |
Zwraca true gdy napotkana znak konca pliku (eofbit). |
bool fail() const; |
Zwraca true gdy wystapil blad (failbit
lub badbit). |
bool bad() const; |
Zwraca true gdy wystapil blad krytyczny (badbit). |
iostate rdstate() const; |
Zwraca aktualny stan wszystkich znacznikow. |
void clear( iostate f = goodbit ) const; |
Zeruje wszystkie znaczniki i nadaje im zadana wartosc. Domyslnie zeruje wszystkie znaczniki. |
void setstate( iostate f ) const; |
Ustawia wartosc konkretnego znacznika. |
Operatory strumieniowe w wyrazeniach logicznych.
Czesto operacje wejscia/wyjscia odbywaja sie w petlach, np. while.
Oczywiscie w kolejnych wykonaniach petli stan strumienia powinien byc poprawny.
I my powinnismy to sprawdzac i odpowiednio reagowac na zmiany zachodzace w strumieniu.
Mozna by sprawdzac to poprzez kontrole stosownych znacznikow stanu. Jednak standard C++
ulatwil nam zycie. Wprowadzono dwa operatory, które robia to za nas.
| Operator | Znaczenie |
|---|---|
operator void* () |
Zwraca wartosc, okreslajaca czy ze strumieniem wszystko jest OK. |
operator ! () |
Zwraca wartosc, okreslajaca czy wystapil blad. |
Ponizej kilka przykladow uzycia:
while( cin ) { // rob swoje dopoki stan strumienia wejsciowego jest poprawny.
...
}
if( !cin ) { // strumien jest w stanie bledu
...
}
if( cin >> zmienna ) {
// odczyt powiodl sie, wykorzystaj to
...
}
if( !( cin >> zmienna )) {
// nie udalo sie, tutaj mozesz zaregowac na powstala sytuacje
...
}
Nieformatujace funkcje odczytu danych istream.
| Funkcja | Opis | |
|---|---|---|
|
|
Funkcja odczytuje ze strumienia jeden znak. Jezeli odczyt sie powiodl funkcja zwraca znak. W przeciwnym razie funkcja wywoluje setstat( failbit ) |
|
|
|
Funkcja odczytuje jeden znak i zapisuje w miejsce wskazane przez 'c'. Jezeli odczyt sie nie powiodl wywolywana jest funkcja setstate( failbit ) |
|
|
|
Odczytuje kolejne znaki ze strumienia i zapamietuje je w buforze kontrolowanym przez 'sb'. Funkcja odczytuje kolejne znaki, dopoki nie wystapi jeden z nastepujacych warunkow:
setstate( failbit ) |
|
|
|
Odczytuje kolejne znaki ze strumienia i zapamietuje je w wskazanym buforze.
Funkcja odczytuje kolejne znaki, dopoki nie wystapi jeden z nastepujacych warunkow:
setstate( failbit ) |
|
|
|
Odczytuje kolejne znaki ze strumienia i zapamietuje je w wskazanym buforze.
Funkcja odczytuje kolejne znaki, dopoki nie wystapi jeden z nastepujacych warunkow:
setstate( failbit ) |
|
|
|
Odczytuje kolejne znaki ze strumienia i zapamietuje je w wskazanym buforze.
Funkcja odczytuje kolejne znaki, dopoki nie wystapi jeden z nastepujacych warunkow:
setstate( failbit ) | |
|
|
Odczytuje kolejne znaki ze strumienia i zapamietuje je w wskazanym buforze.
Funkcja odczytuje kolejne znaki, dopoki nie wystapi jeden z nastepujacych warunkow:
setstate( failbit ) |
|
|
|
Funkcja odczytuje ze strumienia ciag znakow, bez ich zapamietywania. Znaki sa pobierane, dopoki nie wystapi jeden z nastepujacych przypadkow:
|
|
|
|
Odczytuje kolejne znaki ze strumienia i zapamietuje w buforze.
Funkcja odczytuje kolejne znaki, dopoki nie wystapi jeden z nastepujacych warunkow:
|
|
|
|
Funkcja "probnik". Odczytuje nastepny znak ze strumienia, ale znak w strumieniu pozostaje. Znak ten jest nadal dostepny dla funkcji czytajacych ze strumienia. | |
|
|
Obie funkcje moga zwrocic do strumienia ostatni odczytany z tego strumienia znak.
UWAGA: postac funkcji putback moze sugerowac, ze mozna 'wlozyc'
do strumienia dowolny znak. Ale tak nie jest!!!
Mozna 'cofnac' do strumienia faktycznie ostatnio odczytany z niego znak.Nalezy pamietac, ze taki zwrot nie zawsze moze byc mozliwy. W przypadku niepowodzenia operacji wywolywana jest funkcja setstate( badbit ) | |
|
|
Funkcja zwraca liczbe odczytanych ze strumienia znakow. Odczytanych przez ostatnia nieformatujaca funkcje odczytu. |
| Contact: piotr@beesoft.org |
(C) 2006-2008 beesoft.org Last modification date: 2008-06-29 |
Visitis counter: |