410 likes | 559 Views
Przestrzenie nazw, strumienie. Przestrzenie nazw. Przestrzeń nazw – co to takiego? namespace Kiedy potrzebujemy przestrzeni nazw?. Przestrzenie nazw - używanie. namespace moja { void printf(int); class plik; void fprintf(const plik&, int); } moja::printf(44); moja::plik plikwe;
E N D
Przestrzenie nazw • Przestrzeń nazw – co to takiego? namespace • Kiedy potrzebujemy przestrzeni nazw?
Przestrzenie nazw - używanie namespace moja { void printf(int); class plik; void fprintf(const plik&, int); } moja::printf(44); moja::plik plikwe; fprintf(plikwe, 31415323);// wystarczy, że jeden z argumentów // należy do przestrzeni moja, aby funkcja // fprintf była najpierw szukana w przestrzni moja // (reguła wyszukiwania Koeniga)
Przestrzenie nazw - używanie • Przestrzenie nazw można dowolnie rozszerzać i łączyć • w jednym pliku • w kilku plikach • Nazwę (lub wszystkie nazwy) z przestrzeni nazw można przenieść na globalny (lokalny) poziom widoczności • using moja::plik; • using namespace moja; • Nie używaj using w plikach nagłówkowych! • dlaczego? • używaj kwalifikacji nazwa_namespace::nazwa_z_namespace!
Przestrzenie nazw – std:: • W przestrzeni nazw std:: zdefiniowana jest Biblioteka Standardowa C++ • klasy strumieniowe • klasy łańcuchowe • STL • Dawniej używano nagłówków (obsolete): „*.h”, „*.hpp”, „*.hxx” • Znacząco rozszerzona w standardzie C++11 (głównie część STL) • Rozszerzenia języka i bibliotek C++11 nie są jeszcze w pełni wspierane przez kompilatory; wykład o C++11 na przedmiocie MiNWO poświęcony będzie nowemu standardowi C++
Książki o STL i bibliotece standardowej C++ • Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 1st, Pearson 1999, przykłady: http://www.josuttis.com/libbook/examples.zip • (Polska wersja: Nicolai M. Josuttis: C++ Biblioteka standardowa Podręcznik Programisty, Helion 2003, przykłady: ftp://ftp.helion.pl/przyklady/cpbspp.zip) • Nicolai M. Josuttis: C++ Standard Library: A tutorial and Reference, 2nd, Addison Wesley Longman 2012,(uwzględnia standard C++11) • Grębosz J.: Pasja C++, RM, W-wa • Inne (wspomniane na pierwszym wykładzie o C++,w tym ANSI/ISO C++ standard)
Standardowe wejście/wyjście C++ • Biblioteka IOStream (iostream) • najstarsza część biblioteki standardowej • opracowana przez AT&T • obsługa lokalizacji • obsługa typów • char * (zgodność z wczesnymi implementacjami) • string • iostream to biblioteka wzorców z obsługą sytuacji wyjątkowych
Biblioteka IOStream – podstawy • Klasy • strumień wejściowy istream (wywiedziony ze wzorca: basic_istream<char>) • strumień wyjściowy ostream (wywiedziony ze wzorca: basic_ostream<char>)
Biblioteka IOStream – podstawy • Obiekty (nagłówek: <iostream> • istream cin; //stdin , buforowany • ostream cout; //stdout, buforowany • ostream cerr; //stderr, niebuforowany //skojarzony z konsolą • ostream clog; //bez odp. w C, buforowany //skojarzony z konsolą
Biblioteka IOStream – podstawy • Operatory << i >> • przeciążone dla typów podstawowych, w tym char *, void *, bool, • można przeciążać dla własnych klas. istream is; ostream os; int i; double d; os<<i; is>>i; os<<d; is>>d; os<<i<<d; is>>i>>d; cout<<i<<d; cin>>i>>d; cout<< "\ni wynosi " << i << " a d to " << d << " \n";
Biblioteka IOStream – podstawy • Manipulatory • to są obiekty zdefiniowane aby modyfikować domyślne zachowanie strumienia (np. formatowanie), wyprowadzić znak końca wiersza itp. • programista może definiować własne manipulatory endl //koniec wiersza i wyczyszczenie (flush()) bufora strumienia cout<< "\ni wynosi " << i << " a d to " << d << endl; ends // "\0"; ws // dla istream pobierz (pomiń) białe znaki flush dec, hex, oct
Biblioteka IOStream – szczegóły ios_base basic_streambuf<> basic_ios<> virtual basic_istream<> basic_ostream<> basic_iostream<>
Biblioteka IOStream – szczegóły ios_base • wspólny interfejs klas strumieni w zakresie niezależnym od typu elementów strumienia • definicja stanu strumienia • format przetwarzanych danyc
Biblioteka IOStream – szczegóły basic_ios<> • wspólny interfejs klas strumieni w zakresie zależnym od typu elementów strumienia • definicja bufora danych strumienia (klasa pochodna wzorca basic_streambuf<> dla konkretnego typu elementów strumienia, wraz z definicjami operacji faktycznego odczytu/zapisu danych)
Biblioteka IOStream – szczegóły basic_istream<> basic_ostream<> • wzorce obiektów odpowiednio tylko do odczytu/zapisu • dziedziczą wirtualnie wzorzec basic_ios<> • dla argumentu char wywiedzione są klasy odpowiednio istream i ostream • nagłówki odpowiednio <istream> i <ostream>
Biblioteka IOStream – szczegóły basic_iostream<> • wzorce obiektów do odczytu i zapisu • nagłówek <istream>
Biblioteka IOStream – szczegóły • rezultat operacji strumieniowych • stan strumienia (widoczny w zakresie klasy ios_base, stałe typu iostate) • goodbit // poprawny wynik operacji // poniższe bity wyzerowane • eofbit // napotkano koniec (znak końca) pliku • failbit // operacja zakończona niepowodzeniem // kolejne też będą się kończyć niepow. // trzeba wyzerować failbit • badbit // niepowodzenie i uszkodzenie strumienia
Biblioteka IOStream – szczegóły • rezultat operacji strumieniowych - metody • bool good() // poprawny wynik operacji • bool eof() // napotkano koniec (znak końca) pliku • bool fail() // operacja zakończona niepowodzeniem • bool bad() // niepowodzenie i uszkodzenie strumienia • rdstate() // odczytaj stan strumienia • clear() // ustaw na stan goodbit • clear(state) // ustaw na stan state • setstate(state) // ustaw znaczniki state, nie rusz // pozostałych
Biblioteka IOStream – szczegóły • rezultat operacji strumieniowych – operatory konwersji • operator void* () // odpowiednik !fail() if (cin>>x) // lub: while(cin>>x) { // x odczytane poprawnie } • operator ! () // odpowiednik fail() if ( !!(cin>>x)) // lub: while( !!(cin>>x)) { // x odczytane poprawnie }
Biblioteka IOStream – szczegóły • rezultat operacji strumieniowych – generowanie wyjątków • definicja błędnych sytuacji powodujących zgłoszenie wyjątku (metoda klasy strumienia): exceptions(flags) • sprawdzenie błędnych sytuacji powodujących zgłoszenie wyjątku (metoda klasy strumienia): exceptions() jeżeli zwrócona wartość ==goodbit, to wyjątki nie są generowane
Biblioteka IOStream – szczegóły • i/o formatowane a nieformatowane • operatory << i >> domyślnie obsługują i/o formatowane (określona precyzja, pomijanie białych znaków itp.) • metody get*/put*/read*/write* i in. obsługują i/o nieformatowane
Biblioteka IOStream – szczegóły • i/o formatowane • metody dla znaczników formatu (ios::fmtflags) • setf(flags); // ustaw znacznik(i) flags • setiosflags(flags); // odpowiednik setf(flags); • setf(flags, mask); // ustaw znacznik(i) flags w grupie mask • resetiosflags(mask); // odpowiednik setiosflags(0, mask); • unsetf(flags); // wyczyść znacznik(i) flags • flags(); // zwróć aktualne znacznik(i) flags • flags(flags); // ustaw znaczniki flags, wyzeruj pozosałe • copyfmt(stream) // kopiuj znaczniki ze strumienia stream
Biblioteka IOStream – szczegóły • i/o formatowane - • znaczniki i maski • boolalpha // znacznik: typ bool liczbowy (0/1) czy opisowy // true/false // zdefiniowano również manipulatory boolalpha i noboolalpha • adjustfield // maska: wyrównanie (left, right, internal) • left // znacznik: wyrównanie do lewej • right // znacznik: wyrównanie do prawej • internal // znacznik: wyrównanie znaku liczby do lewej // reszta wartości do prawej // zdefiniowano również manipulatory left, right i internal
Biblioteka IOStream – szczegóły • i/o formatowane - • znaczniki i maski • showpos // poprzedź liczby dodatnie znakiem „+” // zdefiniowano również manipulatory showpos i noshowpos • uppercase // liczby szcesnastkowe pisz dużymi literami // zdefiniowano również manipulatory uppercase i nouppercase • basefield // maska: podstawa systemu liczbowego • dec, hex oct // znaczniki systemu liczbowego • (pusty) // znacznik: zapisuj dziesiętnie, odczytuj zgodnie // z prefiksem liczby 0x – hex, 0 – oct, else: dec // zdefiniowano również manipulatory dec hex i oct
Biblioteka IOStream – szczegóły • i/o formatowane - • znaczniki i maski • showbase // wyprowadź prefiks liczby dla systemu liczbowego // zdefiniowano również manipulatory showbase i noshowbase • floatfield // maska: format zmiennego przecinka • fixed // ułamek dziesiętny • scientific // z wykładnikiem • (pusty) // wybierz sam najlepszy // zdefiniowano również manipulatory fixed i scientific • showpoint // dla liczby zmiennoprzecinkowej zawsze // wyprowaź kropkę // zdefiniowano również manipulatory showpoint i noshowpoint
Biblioteka IOStream – szczegóły • i/o formatowane • precision() // zwróć dokładność dla liczb // zmiennorzecinkowych, // domyślnie 6 miejsc po przecinku • precision(p) // ustaw dokładność dla liczb // zmiennorzecinkowych // jest również manipulator setprecision(w)
Biblioteka IOStream – szczegóły • i/o formatowane - • znaczniki • skipws // pomijaj białe znaki // zdefiniowano również manipulatory skipws i noskipws • unitbuf // opróżnij bufor wyjściowy // po każdym << // zdefiniowano również manipulatory unitbuf i nounitbuf
Biblioteka IOStream – szczegóły • i/o formatowane • width() // zwróć szerokość pola (liczba znaków) // znaczy: nie mniej niż • width(w) // ustaw szerokość pola (liczba znaków) // znaczy: nie mniej niż // jest również manipulator setw(w) char buf[80]; cin >> setw(sizeof(buffer)) >> buffer; • fill() // zwróć znak dopelniajacy pole • fill(c) // ustaw znak dopelniajacy pole // jest również manipulator setfill(c)
Biblioteka IOStream – szczegóły • i/o formatowane • metody dla lokalizacji programów, znaków międzynarodowych, itp. • są … opisane w dokumentacji ;-)
Biblioteka IOStream – szczegóły • i/o nieformatowane • metoda get • int get(); // odczytaj jeden znak, lub EOF // odpowiednik getchar()/getc() • istream& get(char &c); // nie ma EOF, jest stan str. • istream& get(char *pc, streamsize cnt) • istream& get(char *pc, streamsize cnt, char delim) // wczytaj do bufora pc, zatrzymaj się po przeczytaniu // cnt-1 znaków, lub napotkaniu znaku delim // nie odczytuj delim, dopisz do bufora ‘\0’ • istream& ignore(streamsize cnt, char delim) // kilka wariantów, pobierz ale nie zapisuj
Biblioteka IOStream – szczegóły • i/o nieformatowane • metoda getline • istream& getline(char *pc, streamsize cnt) • istream& getline(char *pc, streamsize cnt, char delim) // wczytaj do bufora pc, zatrzymaj się po przeczytaniu // cnt-1 znaków, lub napotkaniu odpowiednio // konca wiersza lub znaku delim // delim jest odczytywany ze strumienia // jeżeli odczytano mniej niż cnt znaków to ustaw failbit
Biblioteka IOStream – szczegóły • i/o nieformatowane • metody read i readsome – wybrane aspekty • istream& read(char *pc, streamsize cnt) // odczytaj cnt znaków • streamsize readsome(char *pc, streamsize cnt) // zwróć liczbę przeczytanych znaków, // odczytaj nie więcej niż cnt-1 znaków // pobierz tylko te znaki, które już są w buforze (niedestrukcyjne)
Biblioteka IOStream – szczegóły • i/o nieformatowane • int peek(char *pc, streamsize cnt) // odczytaj następny znak, ale nie pobieraj go z bufora • istream& unget() // zwróć ostatnio odczytany znak // zależnie od implementacji zadziała 1 lub wiecej // razy pod rząd // jeżeli nie powiedzie się to ustaw badbit • istream& putback(char c) // j.w., ale jeżeli c nie jest ostatnio pobranym znakiem // to ustaw badbit
Biblioteka IOStream – szczegóły • i/o nieformatowane • ostream& put(char c) // zapisz c do strumienia • ostream& write(const char *pc, streamsize cnt) // zapisz cnt znakow od adresu pc do strumienia // nie dopisuj (automatycznie) \0 • ostream& flush()
Biblioteka IOStream – podstawy • Klasy strumieni plikowych • strumień wejściowy ifstream (wywiedziony ze wzorca: basic_ifstream<char> /pochodny basic_istream<char> /) • strumień wyjściowy ofstream (wywiedziony ze wzorca: basic_ofstream<char> /pochodny basic_ostream<char> /) • strumień we/wy fstream (wywiedziony ze wzorca: basic_fstream<char> /pochodny basic_iostream<char> /)
Biblioteka IOStream – podstawy int i; ifstream plikwe(„plik.txt”); if (!plikwe) cout<<„nie otworzylem pliku”; else plikwe>>i;
Biblioteka IOStream – podstawy • Znaczniki dla plików (widoczne w zakresie std::ios) • argumenty konstruktora: fstream(nazwa, znaczniki=def) • in // znacznik: strumień wejściowy domyślny dla ifstream • out // znacznik: strumień wyjściowy domyślny dla ofstream • app // z.: dla pliku wyjściowego ustaw się na końcu pliku • ate // z.: ustaw się na końcu pliku • out // z.: usuń zawartość pliku (jeżeli niepusty) • binary // z.: tryb binarny (nie tłumacz CR LF) ifstream ibin(„data.bin”, std::ios::in | std::ios::binary);
Biblioteka IOStream – podstawy • Metody dla strumieni plikowych • open // ( nazwa_pliku [, znaczniki] ) • close // () • is_open // czy skojarzony z otwartym plikiem? • tellg/tellp // pobierz aktualną pozycją odczytu/zapisu • seekg/seekp // seek dla odczytu/zapisu, // przeciążone wersje: poz. względna/bezwzględna ifstream ibin(„data.bin”, std::ios::in | std::ios::binary);
Biblioteka IOStream – szczegóły • Klasy strumieni plikowych • szczegóły są opisane w dokumentacji … ;-)
Biblioteka IOStream – podstawy • Klasy strumieni pamięciowych (łańcuchowych) • strumień wejściowy istringstream (wywiedziony ze wzorca: basic_istringstream<char> /pochodny basic_istream<char> /) • strumień wyjściowy ostringstream (wywiedziony ze wzorca: basic_ostringstream<char> /pochodny basic_ostream<char> /) • strumień we/wy stringstream (wywiedziony ze wzorca: basic_stringstream<char> /pochodny basic_iostream<char> /)
Biblioteka IOStream – szczegóły • Klasy strumieni pamięciowych • szczegóły są opisane w dokumentacji … ;-)