klasy strumieniowe uzupełnienie Języki Programowania (język C++) Klasy strumieniowe Pliki nagłówkowe Klasy strumieniowe Obiekty globalne

Podobne dokumenty
Wejście wyjście strumieniowe

Programowanie w językach

Operacje wejścia/wyjścia (odsłona druga) - pliki

C++ - [3-5] Pliki i strumienie w C++

Wykład 2 Operacje wejściawyjścia. Ewa Gajda

Programowanie i struktury danych

Pliki i manipulatory. - Łańcuchowe funkcje wejścia - getline(string) Dorota Pylak - Tryby otwarcia pliku - Formatowanie manipulatory

Program dopisujący gwiazdkę na końcu pliku tekstowego o nazwie podanej przez uŝytkownika oraz wypisujący zawartość tego pliku.

Spis treści OBSŁUGA PLIKÓW W JĘZYKU C++ Informatyka 2. Instrukcja do pracowni specjalistycznej z przedmiotu. Numer ćwiczenia INF32

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Język C++ wykład VIII

C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE

Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory

Wejście-wyjście w C++ Podstawy operacji

C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Pliki wykład 2. Dorota Pylak

jest mocny, skoro da się w nim wyrazić nowe pojęcia; łatwiej przenieść go na nową platformę jest mniejszy.

Operacje na plikach (niskiego poziomu) < IO.H >

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

C++ - szablony. C++ - szablony. C++ - strumienie. C++ - strumienie. C++ - strumienie STRUMIENIE

Biblioteka standardowa - operacje wejścia/wyjścia

Pliki wykład. Dorota Pylak

Programowanie Obiektowe i C++

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Operacje wejścia/wyjścia odsłona pierwsza

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 24

Pliki wykład. Dorota Pylak

C++ - strumienie. Strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. C++ - strumienie. Formatowanie strumieni wyjściowych

Klasa iostream... 1 Klasy ofstream, ifstream Struktura FILE... 8

1 Pierwsze kroki w C++ cz.3 2 Obsługa plików

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Strumienie standardowe C

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Pliki wykład 2. Dorota Pylak

Podstawy Programowania

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Wykład :37 PP2_W9

Wstęp do programowania obiektowego

1 Strumienie. 2 Pliki. 2.1 Zapis do pliku tekstowego. Programowanie w j zyku C - Adam Krechowicz, Daniel Kaczmarski

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Wskaźniki do funkcji. Wykład 11. Podstawy programowania ( język C ) Wskaźniki do funkcji (1) Wskaźniki do funkcji (2)

Podstawy programowania w C++

C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony

BIBLIOTEKA STANDARDOWA C++

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

Programowanie Procedurale. Pliki w języku C++

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Programowanie obiektowe

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Język C++ zajęcia nr 1

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Dziedziczenie & W slajdach są materiały zapożyczone z

Programowanie i struktury danych

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Spis treści OPERACJE WEJŚCIA-WYJŚCIA W JĘZYKU C++. STEROWANIE FORMATEM, MANIPULATORY. Informatyka 2

I znowu można jak w C, za pomocą starych struktur i metod:

dr inż. Paweł Myszkowski Wykład nr 8 ( )

Podstawy programowania skrót z wykładów:

Języki programowania obiektowego Nieobiektowe elementy języka C++

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Funkcje zawarte w bibliotece < io.h >

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Funkcje zawarte w bibliotece < io.h >

Część 4 życie programu

Wprowadzenie do programowania i programowanie obiektowe

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Wykład PASCAL - Pliki tekstowe

C++ - szablony. C++ - szablony. C++ - szablony. C++ - szablony SZABLONY SZABLONY FUNKCJI

Wstęp do programowania

Wyjątki (exceptions)

Referencje. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zasady zaliczeń. Zaawansowane Programowanie Obiektowe. Informacje organizacyjne:

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Operatory na rzecz typu TString

dr inż. Jarosław Forenc

Podstawy programowania w języku C++

Język C++ Różnice między C a C++

Konwersje. Programowanie obiektowe (2005/2006) Wykład 4

I - Microsoft Visual Studio C++

Wstęp do programowania

Wykład nr 4. Temat: Dynamiczny przydział pamięci, zastosowania wskaźników, praca z plikami.

Programowanie komputerowe. Zajęcia 1

Podstawy programowania

Wykład 9 Pliki cz.3 (getline(string)) Typ wyliczeniowy enum

Pliki. Operacje na plikach w Pascalu

Programowanie w językach wysokiego poziomu

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Wstęp do Programowania 2

Transkrypt:

Języki Programowania (język C++) uzupełnienie klasy strumieniowe Tomasz Marks - Wydział MiNI PW -1- Tomasz Marks - Wydział MiNI PW -2- Klasy strumieniowe Pliki nagłówkowe Definicje związane z klasami strumieniowymi zawarte są w kilku plikach nagłówkowych: <iosfwd> - deklaracje zapowiadające klas strumieniowych. Niezbędny, bo niedozwolone jest uŝycie prostych deklaracji zapowiadających n.p. w postaci class ostream. <streambuf> - definicje dla klasy bazowej bufora strumienia ( basic_streambuf<> ). <istream> - definicje dla klas obsługujących jedynie dane wejściowe ( basic_istream<> ) oraz dla klas obsługujących zarówno operacje wejścia, jak i wyjścia ( basic_iostream<> ). <ostream> - definicje klas strumieni wyjściowych ( basic_ostream<> ). <iostream> - deklaracje globalnych obiektów strumieni (.p. cin, cout ). <iomanip> - parametryzowalne manipulatory. <fstream> - strumienie plikowe. <sstream>, <strstream> - strumienie wykorzystujące łańcuchy znakowe. Tomasz Marks - Wydział MiNI PW -3- Klasy strumieniowe Obiekty globalne Globalne obiekty strumieni standardowych zebrane są w poniŝszej tabeli: Obiekt cin cout cerr clog Typ istream ostream ostream ostream Przeznaczenie odczyt danych ze standardowego kanału wejściowego zapis danych do standardowego kanału wyjściowego zapis komunikatów o błędach do standardowego kanału błędów zapis komunikatów "logów" do standardowego kanału logów. Tomasz Marks - Wydział MiNI PW -4-

Klasy strumieniowe Stan strumienia (1) KaŜdy strumień posiada swój stan określający w szczególności, czy operacja we/wy zakończyła się powodzeniem, a w przypadku niepowodzenia równieŝ jego przyczynę. Standard określa typ iostate i 4 stałe tego typu, które mogą być wykorzystywane w charakterze znaczników. Typ iostate jest składową klasy ios_base. Stała (znacznik) goodbit eofbit failbit badbit Znaczenie Operacja zakończona poprawnie. śaden inny bit nie jest ustawiony. Napotkano koniec pliku. Błąd: operacja we/wy zakończona niepowodzeniem. Błąd krytyczny: stan niezdefiniowany. Klasy strumieniowe Stan strumienia (2) Metody badania i ustawiania stanu strumieni: Metoda good( ) eof( ) fail( ) bad( ) rdstate( ) clear( ) clear( state ) setstate( state ) Zwraca true, gdy ustawiony znacznik goodbit. Zwraca true, gdy ustawiony znacznik eofbit. Zwraca true, gdy ustawiony znacznik failbit lub badbit. Zwraca true, gdy ustawiony znacznik badbit. Zwraca bieŝący zestaw znaczników. Czyści wszystkie znaczniki. Czyści wszystkie znaczniki i nadaje in wartość określoną przez argument state. Ustawia dodatkowe znaczniki określone przez argument state. Tomasz Marks - Wydział MiNI PW -5- Tomasz Marks - Wydział MiNI PW -6- Klasy strumieniowe Stan strumienia (3) Biblioteka standardowa zawiera definicje dwóch metod, które mogą być uŝyte do testowania stanu strumieni w wyraŝeniach logicznych: operator void* ( ) Zwraca wartość określającą, czy strumień nie jest w stanie błędu odpowiednik:! fail( ). ( przeciąŝenie konwertera (void*) ) operator! ( ) Zwraca wartość określającą, czy strumień jest w stanie błędu odpowiednik: fail( ). ( przeciąŝenie operatora negacji! ) N.p. Klasy strumieniowe Stan strumienia (4) // dopóki strumień cin jest w poprawnym stanie while ( cin ). Jedna z alternatyw: // dopóki strumień cin jest w poprawnym stanie while ( cin.good() ). N.p. if (! (cin >> x) ) // odczyt x zakończył się niepowodzeniem.. Jedna z alternatyw: if ( (cin >> x).fail() ) // odczyt x zakończył się niepowodzeniem.. Tomasz Marks - Wydział MiNI PW -7- Tomasz Marks - Wydział MiNI PW -8-

Klasy strumieniowe Wyjątki Strumienie domyślnie nie generują wyjątków. W przypadku strumieni standardowych jest moŝliwość określenia dla kaŝdego znacznika stanu, czy jego ustawienie ma generować wyjątek. SłuŜy do tego metoda exceptions(): exceptions ( flags ) argument flags określa znaczniki stanu strumienia powodujące generowanie wyjątków. JeŜeli flags ma wartość 0 lub goodbit, to Ŝadne wyjątki nie będą generowane. Klasy strumieniowe Operatory we/wy Podstawowymi "narzędziami" dla strumieniowego wprowadzania/wyprowadzania danych są przeciąŝenia operatorów: dla wprowadzania istream& operator >> ( istream&, typ_drugiego_parametru ); dla wyprowadzania ostream& operator << ( ostream&, typ_drugiego_parametru ); exceptions ( ) Zwraca bieŝący zestaw znaczników stanu strumienia powodujących generowanie wyjątków. JeŜeli zwracaną wartością jest goodbit, to oznacza, Ŝe Ŝadne wyjątki nie będą generowane. Oprócz nich przewidziano cały szereg dodatkowych metod realizujących szczególne funkcje. Tomasz Marks - Wydział MiNI PW -9- Tomasz Marks - Wydział MiNI PW -10- Klasy strumieniowe Metody odczytu (1) Metody odczytu danych (opisy uproszczone): int get( ) Odczytuje następny znak. Zwraca kod znaku lob EOF. istream& get( char& c ) - Odczytuje następny znak do argumentu c. istream& get( char* s, streamsize n, char delim='\n' ) Odczytuje do n-1 znaków o ile wcześniej nie napotka znaku delim. Znak delim nie jest odczytywany. Odczytywana sekwencja kończona jest znakiem kończącym łańcuchy znakowe (zwykle '\0' ). istream& getline( char* s, streamsize n, char delim='\n' ) Jak wyŝej: odczytuje do n-1 znaków o ile wcześniej nie napotka znaku delim. Znak delim jest odczytywany, ale nie jest umieszczany w s. Jeśli wiersz jest dłŝszy niŝ n-1 znaków, to ustawiony zostanie znacznik failbit. istream& read( char* s, streamsize n ) Odczytuje n znaków. Znak kończący łańcuchy znakowe nie jest dodawany. Odczytanie EOF uznaje za błąd i w takim przypadku ustawia znacznik failbit. streamsize readsome( char* s, streamsize n ) Odczytuje do n znaków dostępnych w buforze strumienia. Znak kończący łańcuchy znakowe nie jest dodawany. Odczytania EOF nie uznaje za błąd. Klasy strumieniowe Metody odczytu (2) Metody odczytu danych (opisy uproszczone) c.d.: streamsize gcount ( ) const Zwraca liczbę znaków odczytaną przez ostatnią operację odczytu w trybie niesformatowanym. istream& ignore( streamsize n=1) Pobiera ze strumienia i odrzuca do n znaków. istream& ignore( streamsize n, int delim) Pobiera ze strumienia i odrzuca do n znaków o ile wcześniej nie napotka znaku delim. int peek( ) Zwraca kod kolejnego znaku (lub EOF) ze strumienia bez jego pobierania. istream& unget( ) Umieszcza ostatnio odczytany znak ponownie w strumieniu. istream& putback( char c ) Umieszcza ostatnio odczytany znak ponownie w strumieniu. Sprawdza,czy c faktycznie było ostatnim znakiem. Tomasz Marks - Wydział MiNI PW -11- Tomasz Marks - Wydział MiNI PW -12-

Klasy strumieniowe Metody zapisu Metody zapisu danych (opisy uproszczone): ostream& put( char c ) Zapisuje argument c do strumienia. ostream& write( const char* s, streamsize n ) Zapisuje n znaków. Znak kończący łańcuchy znakowe nie jest dopisywany. istream& get( char* s, streamsize n, char delim='\n' ) Odczytuje do n-1 znaków o ile wcześniej nie napotka znaku delim. Znak delim nie jest odczytywany. Odczytywana sekwencja kończona jest znakiem kończącym łańcuchy znakowe ( zwykle '\0' ). ostream& flush( ) OpróŜnia bufor strumienia (wymusza zapisanie wszystkich buforowanych danych do urządzenia lub kanału we/wy, z którym skojarzony jest strumień). Klasy strumieniowe Uwaga UWAGA: Podane wyŝej opisy uproszczone mogą być niewystarczające w praktycznych zastosowaniach, dlatego naleŝy sięgnąć do pełnych (pełniejszych) opisów zawartych w literaturze, n.p.: ostream& ostream::write( const char* s, streamsize n ) Zapisuje n znaków z łańcucha s do strumienia. Zwraca strumień. Stan strumienia określa, czy operacja zapisu została zakończona powodzeniem. Znak końca łańcucha znakowego nie jest dodawany automatycznie i dlatego teŝ powinien zostać zapisany ręcznie. Funkcja wywołująca musi zapewnić, aby łańcuch s w rzeczywistości zawierał przynajmniej n znaków. W innym przypadku zachowanie funkcji jest niezdefiniowane. Patrz: Nicolai M. Josuttis ( str. 566 ). Te opisy mogą teŝ zawierać błędy i często zachodzi potrzeba wykonania paru własnych eksperymentów w celu ustalenia właściwej interpretacji zobacz opis metody peek() tamŝe. Tomasz Marks - Wydział MiNI PW -13- Tomasz Marks - Wydział MiNI PW -14- Klasy strumieniowe Manipulatory (1) Manipulatory są narzędziami modyfikującymi strumień w przypadku ich zastosowania wraz ze standardowymi operatorami we/wy. klasy strumieniowe c.d. Najprostrze manipulatory dostępne są w plikach <istream>, <ostream>. Manipulator flush endl ends we/wy wy wy wy Znaczenie OpróŜnia bufor danych wyjściowych do urządzenia. Wstawia znak nowego wiersza i opróŝnia bufor danych wyjściowych do urządzenia. Wstawia znak zakończenia łańcucha znakowego do bufora. ws we Odczytuje i pomija białe znaki. Tomasz Marks - Wydział MiNI PW -15- Tomasz Marks - Wydział MiNI PW -16-

Klasy strumieniowe Manipulatory (2) Manipulatory powyŝej opisane bazują na przeciąŝeniach odpowiednich operatorów we/wy, n.p: ostream& ostream::operator << ( ostream& (*op) (ostream& ) ) // wywołaj funkcję przekazaną jak argument return (*op) ( *this ); (to przeciąŝenie realizowane jest jako metoda) a sam manipulator realizowany jest jako funkcja: ostream& endl ( ostream& strm ) strm.put( '\n' ); strm.flush( ); return strm; Tomasz Marks - Wydział MiNI PW -17- Klasy strumieniowe Formatowanie Formatowanie operacji we/wy związane jest z dwoma aspektami - określenie szczegółów postaci danych (n.p. precyzja, znak wypełnienia, podstawa numeryczna); - spełnienie określonych aspektów narodowych. Tym drugim aspektem nie będzięmy się tu zajmowali. Pierwszy aspekt związany jest z kilkoma polami składowymi określonymi i uŝywanymi w klasie ios_base w celu określenia róŝnych formatów we/wy. W szczególności moŝna tu wymienić: - minimalna szerokość pola, - precyzja liczb rzeczywistych, - znak wypełnienia, - znaczniki konfiguracji formatu (typ ios_base::fmtflags). Klasa ios_base udostępnia funkcje składowe (metody) pozwalające kontrolować (tzn. ustawiać i sprawdzać) wartości wymienionych pól. Do ustalania wartości pól związanych z formatowaniem przewidziano równieŝ szereg manipulatorów, z których moŝna korzystać w połączeniu z operatorami << i >>. Tomasz Marks - Wydział MiNI PW -18- Klasy strumieniowe Znaczniki formatu (1) Znaczniki formatu są danymi binarnymi (1-0, tak-nie, ON-OFF); Klasy strumieniowe Znaczniki formatu (2) Znaczniki formatu c.d.: Maska adjustfield adjustfield adjustfield adjustfield basefield basefield basefield basefield Znacznik boolalpha left right internal brak showpos uppercase oct dec hex brak JeŜeli ustawiony, to... bool reprezentowany tekstowo (jeśli nie - numerycznie) wyrównuje wartość do lewej wyrównuje wartość do prawej wyrównuje znak do lewej, a wartość do prawej wyrównuje wartość do prawej (domyślne) zapisuje znak plus dla wartości dodatnich uŝywa wielkich liter zapisuje i odczytuje liczby w systemie ósemkowym zapisuje i odczytuje liczby w systemie dziesiętnym zapisuje i odczytuje liczby w systemie szesnastkowym zapis dzies.; odczyt w zaleŝności od znaków poprz. Maska floatfield floatfield floatfield Znacznik showbase fixed scientific brak showpoint skipws unitbuf JeŜeli ustawiony, to... wskazuje na podstawę numeryczną uŝywa notacji dziesiętnej uŝywa notacji naukowej uŝywa "lepszej" notacji (domyślne) zapisuje zawsze separator dziesiętny przy odczycie pomija początkowe białe znaki opróŝnia bufor wyjściowy po kaŝdej operacji zapisu Tomasz Marks - Wydział MiNI PW -19- Tomasz Marks - Wydział MiNI PW -20-

Klasy strumieniowe Metody formatowania (1) Dostępne są następujące metody formatowania: Klasy strumieniowe Metody formatowania (2) Dostępne są metody formatowania c.d.: Metoda Metoda setf(flags) setf(flags,mask) unsetf(flags) flags() flags(flags) copyfmt(strm) ustawia znaczniki określone przez flags i zwraca poprzedni stan wszystkich znaczników ustawia znaczniki w grupie mask określone przez flags i zwraca poprzedni stan wszystkich znaczników czyści znaczniki określone przez flags zwraca aktualny stan wszystkich znaczników ustawia wszystkie znaczniki według flags i zwraca poprzedni stan wszystkich znaczników kopiuje wszystkie definicje formatu ze strumienia strm width( ) width(val) fill( ) fill(c) precision( ) precision(val) zwraca aktualną szerokość pola ustawia szerokość pola według val i zwraca poprzednią wartość zwraca aktualny znak wypełnienia określa znak c jako znak wypełnienia i zwraca poprzednią wartość znaku wypełnienia zwraca aktualną dokładność wartości zmiennopozycyjnych ustawia wartość val, jako dokładność wartości zmiennopozycyjnych i zwraca jej dotychczasową wartość Tomasz Marks - Wydział MiNI PW -21- Tomasz Marks - Wydział MiNI PW -22- Klasy strumieniowe Manipulatory (3) Dostępne są następujące manipulatory: Klasy strumieniowe Manipulatory (4) Dostępne manipulatory c.d.: Manipulator Manipulator setiosflags(flags) resetiosflags(mask) boolalpha noboolalpha setw(val) setfill(c) left right internal ustawia dla strumienia znaczniki określone przez flags czyści znaczniki strumienia w grupie mask wybiera reprezentację tekstową dla wartości logicznych wybiera reprezentację numeryczną dla wartości logicznych ustawia szerokość pola dla danych we/wy na wartość val wybiera znak c jako znak wypełnienia wybiera lewostronne wyrównanie wartości wybiera prawostronne wyrównanie wartości wybiera prawostronne wyrównanie wartości i lewostronne wyrównanie dla znaku showpos noshowpos uppercase nouppercase oct dec hex showbase noshowbase showpoint noshowpoint wyprowadzenie znaku plus dla wartości dodatnich znak plus nie będzie wyprowadzany dla wartości dodatnich uŝywanie wielkich liter do zapisu wartości uŝywanie małych liter do zapisu wartości zapis / odczyt liczb w systemie ósemkowym zapis / odczyt liczb w systemie dziesiętnym zapis / odczyt liczb w systemie szesnastkowym określa podstawę numeryczną nie określa podstawy numerycznej zawsze zapisuje znak separatora dziesiętnego nie wymaga uŝycia znaku separatora dziesiętnego Tomasz Marks - Wydział MiNI PW -23- Tomasz Marks - Wydział MiNI PW -24-

Klasy strumieniowe Manipulatory (5) Dostępne manipulatory c.d.: Manipulator setprecision(val) fixed scientific skipws noskipws unitbuf nounitbuf ustawia nową wartość dokładności uŝywa notacji dziesiętnej uŝywa notacji naukowej dla wejścia: pomija poprzedzające białe znaki dla wejścia: nie pomija poprzedzających białych znaków opróŝnia bufor danych wyjściowych po kaŝdym zapisie nie opróŝnia bufora danych wyjściowych po kaŝdym zapisie Klasy strumieniowe Dostęp do plików (1) Dostęp do plików za pośrednictwem strumieni opisany jest w bibliotece standardowej przez 4 wzorce klas: basic_ifstream<> odczyt danych basic_ofstream<> zapis danych basic_fstream<> basic_filebuf<> odczyt i zapis danych uzywana przez inne klasy stumieni plikowych w celu wykonywania rzeczywistych operacji odczytu i zapisu danych UWAGA: Korzystanie z manipulatorów sparametryzowanych wymaga włączenia pliku nagłówkowego <iomanip>. Tomasz Marks - Wydział MiNI PW -25- Tomasz Marks - Wydział MiNI PW -26- Klasy strumieniowe Dostęp do plików (2) Deklaracje tych klas udostępniane są przez włączenie nagłówka <fstream> namespace std template < class chart, class traits = char_traits<chart> > class basic_ifstream; typedef basic_ifstream<char> ifstream; typedef basic_ifstream<wchar_t> wifstream; template < class chart, class traits = char_traits<chart> > class basic_ofstream; typedef basic_ofstream<char> ofstream; typedef basic_ofstream<wchar_t> wofstream; template < class chart, class traits = char_traits<chart> > class basic_fstream; typedef basic_fstream<char> fstream; typedef basic_fstream<wchar_t> wfstream; template < class chart, class traits = char_traits<chart> > class basic_filebuf; typedef basic_filebuf<char> filebuf; typedef basic_filebuf<wchar_t> wfilebuf; Tomasz Marks - Wydział MiNI PW -27- Klasy strumieniowe Dostęp do plików (3a) // pliki1.cpp #include <iostream> #include <fstream> #include <iomanip> #include <cstdlib> using namespace std; int main ( ) ofstream file( "charset.txt" ); if (! file ) cout << "Nie mozna otworzyc pliku do zapisu!" << endl; exit( EXIT_FAILURE ); for ( int i=32; i<256; i++ ) file << "kod: " << setw( 3 ) << i << " " << "znak: " << static_cast<char>( i ) << endl; // plik będzie zamknięty automatycznie Tomasz Marks - Wydział MiNI PW -28-

Klasy strumieniowe Dostęp do plików (3b) ifstream file( "charset.txt" ); if (! file ) cout << "Nie mozna otworzyc pliku do odczytu!" << endl; exit( EXIT_FAILURE ); char c; while ( file.get( c ) ) cout.put( c ); // plik będzie zamknięty automatycznie Tomasz Marks - Wydział MiNI PW -29- Klasy strumieniowe Dostęp do plików (3c) kod: 32 znak: kod: 33 znak:! kod: 34 znak: " kod: 35 znak: # kod: 36 znak: $ kod: 37 znak: % kod: 38 znak: &......... kod: 97 znak: a kod: 98 znak: b kod: 99 znak: c kod: 100 znak: d kod: 101 znak: e kod: 102 znak: f kod: 103 znak: g Tomasz Marks - Wydział MiNI PW -30- Klasy strumieniowe Dostęp do plików (4) Do kontroli trybu przetwarzania plików słuŝą znaczniki typu openmode zdefiniowane w klasie ios_base: Klasy strumieniowe Dostęp do plików (5) Dopuszczalne są jedynie wymienione niŝej kombinacje znaczników: Znacznik in out app ate trunc binary Znaczenie znacznika otwórz plik do odczytu (domyślne dla ifstream) otwórz plik do zapisu (domyślne dla ofstream) przy zapisie dołączaj znaki zawsze na koniec pliku po otwarciu pliku ustaw się na jego końcu usuwa oryginalną zawartość pliku zapisuj w trybie binarnym (nie zastępuj znaków specjalnych) Znaczniki in out out trunc out app in out in out trunc odp. w jęz. C "r" "w" "a" "r+" "w+" Znaczenie tylko odczyt (plik musi istnieć) tylko zapis (wyczyść plik, gdy istnieje, w przeciwnym przypadku utwórz) tylko zapis (dopisuj na końcu, gdy istnieje, w przeciwnym przypadku utwórz) zapis i odczyt (plik musi istnieć, po otwarciu ustaw się na początku pliku) zapis i odczyt (wyczyść plik, gdy istnieje, w przeciwnym przypadku utwórz) Tomasz Marks - Wydział MiNI PW -31- Tomasz Marks - Wydział MiNI PW -32-

Klasy strumieniowe Dostęp do plików (6) Metody niezaleŝnego od utworzenia strumienia otwierania pliku i niezaleŝnego od destruktora zamykania pliku zebrano w poniŝej: Klasy strumieniowe Dostęp do plików (7) Swobodny dostęp do danych zawartych w pliku wymaga metod odczytu i zmiany pozycji bieŝącej: Metoda Metoda open(name) otwiera dla strumienia plik name w trybie domyślnym tellg( ) seekg(pos) seekg(offset,rpos) tellp( ) zwraca bezwzględną pozycję odczytu ustawia bezwzględną pozycję odczytu ustawia względną pozycję odczytu zwraca bezwzględną pozycję zapisu g get p put open(name,mode) otwiera dla strumienia plik name w trybie mode seekp(pos) ustawia bezwzględną pozycję zapisu close( ) zamyka strumień plikowy seekp(offset,rpos) ustawia względną pozycję zapisu is_open( ) określa, czy strumień reprezentuje otwarty plik pos pozycja bezwzględna jest typu pos_type; offset przesunięcie jest typu off_type; rpos połoŝenie, względem którego liczone jest przesunięcie, jest typu seekdir i mogą mieć wartości: beg, cur, end. Tomasz Marks - Wydział MiNI PW -33- Tomasz Marks - Wydział MiNI PW -34- Klasy strumieniowe Dostęp do plików (8a) // pliki2.cpp #include <iostream> #include <fstream> #include <iomanip> #include <cstdlib> using namespace std; int main ( ) fstream file; file.open( "charset.txt", ios::out ); if (! file ) cout << "Nie mozna otworzyc pliku do zapisu!" << endl; exit( EXIT_FAILURE ); for ( int i=32; i<256; i++ ) file << "kod: " << setw( 3 ) << i << " " << "znak: " << static_cast<char>( i ) << endl; file.close( ); // plik będzie zamknięty "na Ŝyczenie" Tomasz Marks - Wydział MiNI PW -35- Klasy strumieniowe Dostęp do plików (8b) file.open( "charset.txt", ios::in ); if (! file ) cout << "Nie mozna otworzyc pliku do odczytu!" << endl; exit( EXIT_FAILURE ); char c; while ( file.get( c ) ) cout.put( c ); // plik będzie zamknięty automatycznie Tomasz Marks - Wydział MiNI PW -36-

Klasy strumieniowe Dostęp do plików (8c) UWAGA: Wszystkie znaczniki związane z obsługą strumieni zdefiniowane są w klasie ios_base, z której z kolei dziedziczą wszystkie interesujące nas klasy n.p. ifstream, ofstream, fstream. W starszych wersjach C++ były one zdefiniowane w klasie ios. Obecnie klasa ios teŝ jest dostępna (ze względu na zgodność ze starszymi wersjami) i dziedziczy z ios_base, co umoŝliwia skrócenie zapisu: zamiast ios_base::out moŝemy napisać ios::out Klasy strumieniowe Dostęp do plików (9a) // pliki3.cpp #include <iostream> #include <fstream> #include <iomanip> #include <cstdlib> using namespace std; int main ( ) fstream file; file.open( "charset.txt", ios::out ios::in ios::trunc ); if (! file ) cout << "Nie mozna otworzyc pliku!" << endl; exit( EXIT_FAILURE ); for ( int i=32; i<256; i++ ) file << "kod: " << setw( 3 ) << i << " " << "znak: " << static_cast<char>( i ) << endl; Tomasz Marks - Wydział MiNI PW -37- Tomasz Marks - Wydział MiNI PW -38- Klasy strumieniowe Dostęp do plików (9b) file.seekg(0); char c; while ( file.get( c ) ) cout.put( c ); // plik będzie zamknięty automatycznie Koniec uzupełnienia. Tomasz Marks - Wydział MiNI PW -39- Tomasz Marks - Wydział MiNI PW -40-