1 Podstawy informatyki Operacje we/wy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka
2 Strumień i flaga Strumień – wprowadzanie i wyprowadzanie danych można potraktować jako strumień bajtów płynący od źródła do ujścia. Flaga – przechowuje informacje typu tak/nie.
3 Strumienie 1.Wyprowadzanie i wprowadzanie informacji ze standardowych urządzeń we/wy (klawiatura/ekran) Biblioteka iostream 2.Wyprowadzanie i wprowadzanie informacji z plików Biblioteka fstream 3.Wyprowadzanie i wprowadzanie informacji z obiektów klasy string Biblioteka sstream
4 Operacje we/wy Przepływ informacji może odbywać się na dwa sposoby: Operacje we/wy bitowe Polega na tym, że określone bajty przesyłane są od źródła do ujścia, a strumień nie interesuje się znaczeniem tych bajtów. Stosujemy, gdy program ma komunikować się nie z człowiekiem, ale z innym programem albo urządzeniem.
5 Operacje we/wy Operacje we/wy tekstowe Polega na tym, że określone bajty przesyłane są od źródła do ujścia oraz ma jeszcze je interpretować (formatować). Stosujemy, gdy program ma komunikować się z człowiekiem. Wszystkie operacje we/wy wykonywane do tej pory były typu tekstowego.
6 Posługiwanie się strumieniem 1.Definiujemy w pamięci obiekt sterowania strumieniem. 2.Wskazujemy jakim urządzeniem ma się zajmować. 3.Przeprowadzamy wczytania (wypisania) informacji. 4.Likwidujemy strumień.
7 Strumienie zdefiniowane standardowo cout – standardowe urządzenie wyjścia cin – standardowe urządzenie wejścia cerr – standardowe urządzenie wyjścia, na które wypisujemy komunikaty o błędach (strumień niebuforowany) clog – standardowe urządzenie wyjścia, na które wypisujemy komunikaty o błędach (strumień buforowany) wcout wcin wcerr wclog
8 Operatory przesunięcia bitowego Operatory > zostały przeładowane w ten sposób, że odpowiadają za wstawianie i wyjmowanie ze strumienia. int a; cin>>a; cout
9 Domniemania (cout) Typy przechowujące liczby całkowite są wypisywane w systemie dziesiętnym. Typy alfanumeryczne są wypisywane jako pojedyncze znaki ASCII Typy przechowujące liczby zmiennoprzecinkowe są wypisywane w postaci 6 cyfr. Wskaźniki (z wyjątkiem char*) są wypisywane w systemie heksadecymalnym.
10 Domniemania (cout) Wypisanie wskaźnika char* powoduje wypisanie C-stringu na który pokazuje, czyli: char *a="Hello"; cout
11 Domniemania (cin) Wszystkie wczytywane typy mogą poprzedzać białe znaki, które są ignorowane. Przy wczytywaniu liczb całkowitych są traktowane jako wprowadzane w systemie dziesiętnym (nie można wprowadzać liczb pisząc np. 011, 0x11). Przy wczytywaniu liczb całkowitych po podaniu pierwszego znaku nie będącego cyfrą wprowadzanie zostaje zakończone. Wprowadzając liczby ujemne, pomiędzy znakiem minus a liczbą nie może być spacji.
12 Domniemania (cin) Wprowadzając liczbą zmiennoprzecinkową obowiązują zasady dotyczące liczb całkowitych, jednak w przypadku notacji wykładniczej (naukowej) może wystąpić drugi znak + lub – oraz litera oznaczająca wykładnik. Wewnątrz nie może być spacji. Przy wczytywaniu C-stringów oraz stringów wczytywanie rozpoczyna się po zignorowaniu białych znaków poprzedzających tekst i kończy się z napotkaniem pierwszego białego znaku.
13 Format state flags Zasady formatowania są zapisane w tak zwanych flagach stanu formatowania i znajdują się w klasie ios_base
14 Hierarchia klas
15 Flagi i maski Flagi: skipwsignoruj białe znaki leftlewe justowanie rightprawe justowanie internal„wewnętrzne” justowanie boolalphaużywaj słów true/false deckonwersja decymalna octkonwersja oktalna hexkonwersja heksadecymalna showbasepokaż podstawę konwersji showpointpokaż kropkę dziesiętną
16 Flagi i maski uppercasewielkie litery (w liczbach) showpospokaż znak + w liczbach R + scientificnotacja wykładnicza fixednotacja zwykła unitbufnie buforuj strumienia Maski: adjustfieldmaska dla typu justowania basefieldmaska dla typu konwersji floatfieldmaska dla typu notacji
17 skipws Ustawienie tej flagi powoduję że strumień będzie ignorował białe znaki (spacje, tabulatory, znaki nowej linii), które poprzedzają znaki właściwe. string a; cin >> a; cout a; cout
18 left right internal Wyjustowanie do lewej, prawej lub rozciągnięcie. int a=-12; //ustaw flagę left oraz ustal szerokość cout
19 boolalpha Wartości zmiennych bool są wypisywane jako true / false. bool a=true,b=false; cout
20 dec hex oct Wypisywanie i wprowadzanie liczb w innych systemach liczbowych. int a=20; cout
21 showbase Decyduje czy wypisywać podstawę konwersji. int a=20; //ustwa flagę showbase cout
22 showpos Decyduje czy wypisywać znak + przed liczbami dodatnimi. int a=20; cout
23 uppercase Decyduje czy wypisywać duże litery zawarte w liczbach. double a=1e10; cout
24 showpoint Decyduje czy wypisywać kropkę dziesiętną. double a=1.23,b=4; cout
25 scientific, fixed Decyduje w jakiej notacji wypisywać liczby. double a=123.456; cout
26 Sposoby zmiany formatowania Flagi można zmieniać za pomocą: elementarnych funkcji składowych klasy ios, funkcji składowych klasy ios, które nie zmieniają flag, ale zmieniają towarzyszące im parametry, manipulatorów
27 Elementarne funkcje składowe klasy ios Do zmian flag służą funkcje: fmtflags flags() const; fmtflags flags(fmtflags); fmtflags setf(fmtflags); fmtflags setf(fmtflags, fmtflags); fmtflags unsetf(fmtflags); Typ fmtflags to inna nazwa typu int.
28 Przykład 1 int a=20; cout
29 Przykład 2 double a=123; cout
30 Przykład 3 int a=20; cout
31 Przykład 4 int a=20; cout
32 Funkcje składowe klasy ios, które nie zmieniają flag streamsize width() const; streamsize width(streamsize); streamsize precision() const; streamsize precision(streamsize); char fill() const; char fill(char); Typ streamsize to inna nazwa typu int.
33 Przykład 1 double a=1.0/3.0; cout
34 Przykład 2 int a=-12; cout.setf(ios::left,ios::adjustfield); cout.width(10); cout
35 Przykład 3 int a=-12; cout.fill('.'); cout.setf(ios::left,ios::adjustfield); cout.width(10); cout
36 Manipulatory bezargumentowe boolalpha – noboolalpha hex – dec – oct flush endl skipws – noskipws showpoint – noshowpoint showpos – noshowpos showbase – noshowbase uppercase – nouppercase fixed – scientific left – right - internal
37 Przykład int a=12; cout
38 Manipulatory parametryzowane setw(int) setfill(char) setprecision(int) setbase(int) setiosflags(fmtflags) resetiosflags(fmtflags)
39 Przykład #include … double a=1.0/3.0; cout
40 Przykład int a=20; cout
41 Operacje we/wy Operator > wstawiania/wyjmowania do/z strumienia przeprowadzają operacje wy/we z obecnością formatowania. char z; int a, b; cin >> a >> z >> b; cout
42 Operacje we/wy char z; double a, b; cin >> a >> z >> b; cout
43 Nieformatowane operacje we/wy Funkcje wyjmujące ze strumienia: istream &get(char &); int get(); istream &get(char *, streamsize, char=‘\n’); istream & getline(char *, streamsize, char=‘\n’); istream & read(char *, streamsize); streamsize readsome (char *, streamsize); istream & ignore(int, int);
44 Nieformatowane operacje we/wy Dodatkowe funkcje: streamsize gcount(); int peek(); istream &putback(char); istream &unget();
45 Nieformatowane operacje we/wy Funkcje wkładające do strumienia: ostream &put(char); ostream &write(const char *, streamsize);
46 istream &get(char &znak) Funkcja wyjmuje ze strumienia jeden bajt i umieszcza go w zmiennej znak. char z; cin.get(z); cout (z)
47 int get() Funkcja wyjmuje ze strumienia jeden bajt i umieszcza go w zmiennej a. int a; a=cin.get(); cout (a)
48 istream &get(char *, streamsize, char=‘\n’) Funkcja wyjmuje ze strumienia nie jeden ale wiele znaków. Jej parametry oznaczają: char * - adres tablicy streamsize – maksymalna liczba odczytanych znaków char – ogranicznik char t[10],z; cin.get(t,10,'b'); cout
49 istream &get(char *, streamsize, char=‘\n’) char t[10],z; cin.get(t,3); cout
50 istream &getline(char *, streamsize, char=‘\n’) Funkcja wyjmuje ze strumienia wiele znaków. Parametry jak poprzednio. char t[10]={"........."},z; cin.getline(t,10,'3'); cout
51 istream &getline(char *, streamsize, char=‘\n’) char t[5]={"...."},z; cin.getline(t,5); if (cin.fail()) { cout
52 istream &getline(istream, string, char=‘\n’) string a; getline(cin,a); cout
53 istream & read(char *, streamsize) Funkcja podobna do get, ale w przypadku read na koniec C-stringu nie zostanie dodany znak NULL! Do wykorzystywania przy operacjach z plikami (operacje binarne). streamsize & readsome(char *, streamsize) Funkcja zwraca ile bajtów zostało wczytanych.
54 istream &ignore(int=1, int=EOF) Funkcja wyjmuje ze strumienia określoną liczbę bajtów ale nigdzie ich nie zapisuje. char t1[10],t2[10]; cin.get(t1,3).ignore(3).get(t2,3); cout
55 istream &ignore(int, int) char t1[10],t2[10]; cin.get(t1,3).ignore(3,static_cast ('3')).get(t2,3); cout
56 streamsize gcount() Zwraca informację ile znaków zostało wyjętych ze strumienia podczas ostatniego nieformatowanego wczytywania. char t[10]; cin.get(t,10,'.'); cout
57 streamsize gcount() char t[10]; cin.getline(t,10,'.'); cout
58 int peek() Jest to funkcja, która pozwala nam zajrzeć do strumienia. char t[10]; char a=static_cast (cin.peek()); cin>>t; cout
59 istream &putback(char) Zwraca znak do strumienia. char a,b; cin>>a; cout
60 istream &unget() Zwraca ostatnio odczytany znak do strumienia. char a,b; cin>>a; cout
61 ostream &put(char) Służy do wstawienia do strumienia jednego znaku. char a[]="AGH"; for (int i=0;i
62 ostream &write(const char *, streamsize) Funkcja wstawia do strumienia określoną liczbę bajtów. char a[]="AGH WIMiIP"; cout.write(a+4,6); cout
63 ostream &write(const char *, streamsize) double pi=3.14; cout.write(reinterpret_cast (&pi),sizeof(pi)); cout
64 Strumienie płynące do i z plików Biblioteka: Klasy:ofstream ifstream fstream ifstream plik;tworzenie strumienia do odczytu ofstream plik;tworzenie strumienia do zapisu fstream plik;tworzenie strumienia do odczytu i zapisu
65 void open(char *, ios_base=…) Otwarcia można dokonać za pomocą funkcji open lub konstruktora. ifstream plik; plik.open("dane.txt”); ifstream plik("dane.txt”);
66 void open(char *, ios_base=…) Drugi argument określa tryb pracy: inotwórz do czytania outotwórz do pisania ateotwórz i ustaw się na końcu appotwórz do dopisywania na końcu truncotwórz, a jeśli plik istnieje skasuj jego zawartość Domniemania: ifstream in ofstreamout fstreambrak domniemania
67 Flagi stanu błędu strumienia Istnieją cztery flagi: goodbit – ustawiana gdy pozostałe flagi nie są ustawione, czyli jest OK eofbit – ustawiana, gdy podczas czytania napotkamy koniec pliku failbit – ustawiana, gdy jakaś operacja we/wy się nie powiodła badbit – ustawiana, gdy wystąpi poważny błąd dotyczący strumienia
68 Funkcje do pracy na flagach bool good() bool eof() bool fail() bool bad()
69 bool good() ifstream plik; plik.open("dane.txt"); if (plik.good()) cout
70 bool eof() char litera; ifstream plik; plik.open("napis.txt"); for(;;) { plik.get(litera); if(plik.eof()) break; cout
71 bool fail() int liczba; cin >> liczba; if (cin.fail()) cout
72 const char* c_str() Funkcja składowa klasy string. string nazwa; getline(cin,nazwa); ifstream plik(nazwa.c_str());
73 Ustawianie i kasowani flag błędu io_state rdstate(); void clear(io_state = goodbit); void setstate(io_state); enum io_state { goodbit=0; eofbit=1; failbit=2; badbit=4; };
74 Wybór miejsca czytania i pisania pos_type tellg(); pos_type tellp(); istream &seekg(off_type, seek_dir=ios::beg); ostream &seekp(off_type, seek_dir=ios::beg); enum seek_dir { beg; cur; end; };
75 Zastosowanie seekg i tellg ifstream plik; plik.open("dane.txt"); plik.seekg(0,ios::end); cout
76 Zastosowanie seekp ofstream plik; plik.open("napis.txt"); plik.write("Ala ma kota", 11); plik.seekp(0); plik
77 Strumienie płynące do i z obiektów klasy string Biblioteka: Klasy:ostringstream istringstream stringstream istringstream s;tworzenie strumienia do odczytu ostringstream s;tworzenie strumienia do zapisu stringstream s;tworzenie strumienia do odczytu i zapisu
78 Strumień czytający z obiektu klasy string Konstruktory: istringstream(const string & tekst); istringstream(); Funkcje składowe: void str(const string & tekst) const; string str() const;
79 Strumień czytający z obiektu klasy string string t="12 ala 13.5 X"; istringstream s; s.str(t); cout a>>b>>c>>d; cout
80 Strumień piszący do obiektu klasy string Konstruktory: ostringstream(); ostringstream(const string & tekst); Funkcje składowe: void str(const string & tekst) const; string str() const;
81 Strumień piszący do obiektu klasy string string t; int a=12; string b="ala"; double c=13.5; char d='X'; cout
82 Prezentacja udostępniona na licencji Creative Commons: Uznanie autorstwa, Na tych samych warunkach 3.0. Pewne prawa zastrzeżone na rzecz autorów. Zezwala się na dowolne wykorzystywanie treści pod warunkiem wskazania autorów jako właścicieli praw do prezentacji oraz zachowania niniejszej informacji licencyjnej tak długo, jak tylko na utwory zależne będzie udzielana taka sama licencja. Tekst licencji dostępny jest na stronie: http://creativecommons.org/licenses/by-sa/3.0/deed.pl