1 / 41

Przestrzenie nazw, strumienie

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;

bijan
Download Presentation

Przestrzenie nazw, strumienie

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Przestrzenie nazw, strumienie

  2. Przestrzenie nazw • Przestrzeń nazw – co to takiego? namespace • Kiedy potrzebujemy przestrzeni nazw?

  3. 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)

  4. 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!

  5. 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++

  6. 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)

  7. 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

  8. Biblioteka IOStream – podstawy • Klasy • strumień wejściowy istream (wywiedziony ze wzorca: basic_istream<char>) • strumień wyjściowy ostream (wywiedziony ze wzorca: basic_ostream<char>)

  9. 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ą

  10. 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";

  11. 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

  12. Biblioteka IOStream – szczegóły ios_base basic_streambuf<> basic_ios<> virtual basic_istream<> basic_ostream<> basic_iostream<>

  13. 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

  14. 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)

  15. 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>

  16. Biblioteka IOStream – szczegóły basic_iostream<> • wzorce obiektów do odczytu i zapisu • nagłówek <istream>

  17. 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

  18. 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

  19. 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 }

  20. 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

  21. 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

  22. 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

  23. 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

  24. 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

  25. 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

  26. 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)

  27. 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

  28. 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)

  29. Biblioteka IOStream – szczegóły • i/o formatowane • metody dla lokalizacji programów, znaków międzynarodowych, itp. • są … opisane w dokumentacji ;-)

  30. 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

  31. 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

  32. 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)

  33. 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

  34. 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()

  35. 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> /)

  36. Biblioteka IOStream – podstawy int i; ifstream plikwe(„plik.txt”); if (!plikwe) cout<<„nie otworzylem pliku”; else plikwe>>i;

  37. 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);

  38. 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);

  39. Biblioteka IOStream – szczegóły • Klasy strumieni plikowych • szczegóły są opisane w dokumentacji … ;-)

  40. 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> /)

  41. Biblioteka IOStream – szczegóły • Klasy strumieni pamięciowych • szczegóły są opisane w dokumentacji … ;-)

More Related