Podstawy Programowania - Instytut Informatyki Teoretycznej i
Transkrypt
Podstawy Programowania - Instytut Informatyki Teoretycznej i
Podstawy Programowania dr Elżbieta Gawrońska [email protected] Instytut Informatyki Teoretycznej i Stosowanej dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 1 / 15 Plan wykładu 1 Strumienie plikowe 2 Biblioteka IO Strumień bł˛edu i strumień logowań Czyszczenie strumienia Zabezpieczenie strumienia przed uszkodzeniem 3 Przekierowanie danych ze strumienia dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 2 / 15 Strumienie plikowe Operacje na plikach I typy odpowiedzialne za operacje na plikach zdefiniowane sa˛ w bibliotece fstream (pochodna klasy iostream używana dla plików traktowanych zarówno jako plik wejściowy, jak i wyjściowy) do każdego programu, w którym korzysta si˛e z obsługi plików, udost˛epnianej przez bibliotek˛e iostream, trzeba dołaczyć ˛ dyrektywa˛ preprocesora odpowiedni plik nagłówkowy ofstream – dla plików wyjściowych, ifstream – dla plików wejściowych, zapis do pliku realizuje si˛e przy pomocy zmiennej typu ofstream (pochodna klasy ostream): std::ofstream plik; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 3 / 15 Strumienie plikowe Operacje na plikach I void open (const char* filename, ios_base::openmode mode = ios_base::in | ios_base::out); otwiera plik, którego nazwa˛ jest filename, mode oznacza tryb otwarcia pliku, domyślnie plik jest otwierany tekstowo, a jego zawartość jest kasowana przed zapisem, jeżeli plik nie istnieje, zostaje utworzony; najważniejsze tryby otwarcia pliku: ios::app ios::trunc ios::ate std::ofstream plik; plik.open("plik.txt", ios::app); dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 4 / 15 Strumienie plikowe Operacje na plikach I operacje zapisu do pliku można wykonywać operatorem << w identyczny sposób jak na zmiennych cout, cerr, clog: przykład: std : : ofstream plik ; plik . open ( " plik . txt " ) ; double a = 1 1 . 1 ; plik << " tekst , liczba = " << a << endl ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 5 / 15 Strumienie plikowe Operacje na plikach I close() zamyka plik, każdy otwarty plik powinien być zamkni˛ety przed zakończeniem programu przykład: std : : ofstream plik ; plik . open ( " plik . txt " ) ; / / . . . − o p e r a c j e na p l i k u plik . close ( ) ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 6 / 15 Strumienie plikowe Operacje na plikach I odczyt z pliku realizuje si˛e przy pomocy zmiennej typu ifstream: std::ifstream plik; dla zmiennych typu ifstream działaja˛ w podobny sposób funkcje open oraz close odczyt ze strumienia plikowego typu ifstream może być zrealizowany przy pomocy operatora >> lub funkcji get czy getline w identyczny sposób jak w przypadku strumienia cin: przykład: std : : ifstream plik ; plik . open ( " plik . txt " ) ; double a ; plik >> a ; plik . close ( ) ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 7 / 15 Strumienie plikowe Operacje na plikach I dla wszystkich strumieni plikowych została zdefiniowana funkcja: bool eof(); zwraca wartość true jeżeli przy operacji na pliku został osiagni˛ ˛ ety koniec pliku (EOF) operator ! zastosowany wobec strumieni plikowych ma identyczne zastosowanie jak dla pozostałych strumieni, a sygnalizuje także np.: bł˛edy wejścia–wyjścia (np. brak miejsca na urzadzeniu ˛ na którym ma zostać utworzony plik) brak pliku, który ma zostać otwarty do czytania przed podj˛eciem próby pisania lub czytania do/z pliku należy sprawdzić czy plik został pomyślnie otwarty dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 8 / 15 Strumienie plikowe Biblioteka wejścia–wyjścia przykład: ofstream file ; file . open ( " ala . txt " ) ; if ( ! file ) cerr << " blad otwarcia pliku !" << endl ; file << " Ala i As " << endl ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 9 / 15 Strumienie plikowe Biblioteka wejścia–wyjścia Inne funkcje składowe: bool bad ( ) const; bool fail ( ) const; bool eof ( ) const; bool good ( ) const; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 10 / 15 Biblioteka IO Strumień bł˛edu i strumień logowań Biblioteka wejścia–wyjścia I w bibliotece iostream poza strumieniami cout i cin sa˛ zdefiniowane także: cerr – standardowy strumień diagnostyczny (nie buforowany), służy do odsyłania komunikatów o bł˛edach clog – standardowy strumień logowań (buforowany), służacy ˛ do obsługi bł˛edów operator ! zastosowany wobec strumienia zwraca wartość różna˛ od 0 w przypadku wystapienia ˛ bł˛edu w pracy ze strumieniem, np.: przykład: double a ; cin >> a ; if ( ! cin ) std : : cerr << " Blad w pracy ze strumieniem wejsciowym !" ; dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 11 / 15 Biblioteka IO Czyszczenie strumienia Biblioteka wejścia–wyjścia I clear() czyści stan strumienia (czyści flagi bł˛edów dla strumienia wejściowego, aby późniejsze operacje I/O wykonywały si˛e poprawnie) ignore(int n = 1, int delim = EOF) wyciaga ˛ ze strumienia i ignoruje co najwyżej n znaków do napotkania znaku delim, n - maksymalna liczba znaków do wyodr˛ebnienia i zignorowania w strumieniu. dla strumieni poprzez operator . można wywołać specjalne funkcje sterujace ˛ praca˛ strumienia, np.: przykład: double a ; cin >> a ; if ( ! cin ) { cin . clear ( ) ; cin . ignore ( 1 0 2 4 , ’\n ’ ) ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 12 / 15 Biblioteka IO Czyszczenie strumienia Biblioteka wejścia–wyjścia I przykład: int main ( ) { double a ; do { cout << " Podaj a > 0: " << endl ; cin >> a ; if ( ! cin ) { cin . clear ( ) ; cin . ignore ( 1 0 0 0 , ’\n ’ ) ; } }while ( a <= 0 ) ; cout << " Podales a = " << a << endl ; return 0 ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 13 / 15 Biblioteka IO Zabezpieczenie strumienia przed uszkodzeniem Biblioteka wejścia–wyjścia I uodpornienie programu na bł˛edy, jeśli zamiast liczby użytkownik poda inny znak przykład: while ( ( cin >> liczba ) . fail ( ) ) { cin . clear ( ) ; cin . ignore ( INT_MAX , ’\n ’ ) ; cerr <<" Nieprawidlowe dane ! Powtorz \n" ; } dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 14 / 15 Przekierowanie danych ze strumienia Przykład użycia Przekierowanie ze standardowego strumienia wyjściowego (cout) ./a.out > wynik.txt ./a.out 1> wynik.txt nadpisanie ./a.out 1>> wynik.txt doklejenie do treści już istniejacej ˛ Przekierowanie ze standardowego strumienia bł˛edu i logowań (cerr, cout) ./a.out > wynik.txt ./a.out 2> wynik.txt nadpisanie ./a.out 2>> wynik.txt doklejenie do treści już istniejacej ˛ Przekierowanie ze standardowego strumienia wejścia (cin) ./a.out < dane.txt ostrożnie – brak kontroli dr Elżbieta Gawrońska (ICIS) Podstawy Programowania 06 15 / 15