Programowanie i struktury danych Wykªad 3 1 / 37
tekstowe binarne Wyró»niamy dwa rodzaje plików: pliki binarne pliki tekstowe 2 / 37
binarne tekstowe binarne Plik binarny to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Zapis i odczyt pliku binarnego jest zrealizowany w postaci porcji bajtów, a nast pnie porcja ta mo»e by zinterpretowana jako okre±lony typ danych. Elementem jednostkowym pliku binarnego jest jeden bajt. Format pliku binarnego : [ bajty pliku ] [ EOF ] EOF znak ko«ca pliku (end of le) ctrl+z - systemy windowsowe ctrl+d - UNIX i Macintosch 3 / 37
binarne tekstowe binarne Plik binarny to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Zapis i odczyt pliku binarnego jest zrealizowany w postaci porcji bajtów, a nast pnie porcja ta mo»e by zinterpretowana jako okre±lony typ danych. Elementem jednostkowym pliku binarnego jest jeden bajt. Format pliku binarnego : [ bajty pliku ] [ EOF ] EOF znak ko«ca pliku (end of le) ctrl+z - systemy windowsowe ctrl+d - UNIX i Macintosch 4 / 37
binarne tekstowe binarne Plik binarny to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Zapis i odczyt pliku binarnego jest zrealizowany w postaci porcji bajtów, a nast pnie porcja ta mo»e by zinterpretowana jako okre±lony typ danych. Elementem jednostkowym pliku binarnego jest jeden bajt. Format pliku binarnego : [ bajty pliku ] [ EOF ] EOF znak ko«ca pliku (end of le) ctrl+z - systemy windowsowe ctrl+d - UNIX i Macintosch 5 / 37
binarne tekstowe binarne Plik binarny to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Zapis i odczyt pliku binarnego jest zrealizowany w postaci porcji bajtów, a nast pnie porcja ta mo»e by zinterpretowana jako okre±lony typ danych. Elementem jednostkowym pliku binarnego jest jeden bajt. Format pliku binarnego : [ bajty pliku ] [ EOF ] EOF znak ko«ca pliku (end of le) ctrl+z - systemy windowsowe ctrl+d - UNIX i Macintosch 6 / 37
tekstowe tekstowe binarne Plik tekstowy to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Jednak bajty te mog by zinterpretowane jedynie jako pojedyncze znaki albo ªa«cuchy. Elementem jednostkowym pliku tekstowego jest znak. Format pliku tekstowego : [ znaki 1 linii pliku ] [/ r ] [/ n] [ znaki 2 linii pliku ] [/ r] [/ n]............................................. [ znaki ostatniej linii pliku ][ EOF ] /r znak powrotu karetki, /n znak ko«ca linii w pliku. 7 / 37
tekstowe tekstowe binarne Plik tekstowy to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Jednak bajty te mog by zinterpretowane jedynie jako pojedyncze znaki albo ªa«cuchy. Elementem jednostkowym pliku tekstowego jest znak. Format pliku tekstowego : [ znaki 1 linii pliku ] [/ r ] [/ n] [ znaki 2 linii pliku ] [/ r] [/ n]............................................. [ znaki ostatniej linii pliku ][ EOF ] /r znak powrotu karetki, /n znak ko«ca linii w pliku. 8 / 37
tekstowe tekstowe binarne Plik tekstowy to ci g bajtów zapami tanych w pami ci zewn trznej (dyskowej). Jednak bajty te mog by zinterpretowane jedynie jako pojedyncze znaki albo ªa«cuchy. Elementem jednostkowym pliku tekstowego jest znak. Format pliku tekstowego : [ znaki 1 linii pliku ] [/ r ] [/ n] [ znaki 2 linii pliku ] [/ r] [/ n]............................................. [ znaki ostatniej linii pliku ][ EOF ] /r znak powrotu karetki, /n znak ko«ca linii w pliku. 9 / 37
tekstowe binarne tekstowe zapis do pliku tekstowego Nale»y 1 U»y klasy ofstream do obsªugi strumienia wyj±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cout test25.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wyjsciowego i nazwij go alaout ofstream alaout (" ala. txt ") ; } alaout<<"w pliku :\ n" ; // zapisz do pliku cout<<" Na ekranie : " ; // wypisz na ekranie float x ; cin>>x ; alaout<<" Twoj tajny numer to "<< x <<endl ; alaout. close () ; // zamknij plik return 0 ; 10 / 37
tekstowe binarne tekstowe zapis do pliku tekstowego Nale»y 1 U»y klasy ofstream do obsªugi strumienia wyj±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cout test25.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wyjsciowego i nazwij go alaout ofstream alaout (" ala. txt ") ; } alaout<<"w pliku :\ n" ; // zapisz do pliku cout<<" Na ekranie : " ; // wypisz na ekranie float x ; cin>>x ; alaout<<" Twoj tajny numer to "<< x <<endl ; alaout. close () ; // zamknij plik return 0 ; 11 / 37
tekstowe binarne tekstowe zapis do pliku tekstowego Nale»y 1 U»y klasy ofstream do obsªugi strumienia wyj±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cout test25.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wyjsciowego i nazwij go alaout ofstream alaout (" ala. txt ") ; } alaout<<"w pliku :\ n" ; // zapisz do pliku cout<<" Na ekranie : " ; // wypisz na ekranie float x ; cin>>x ; alaout<<" Twoj tajny numer to "<< x <<endl ; alaout. close () ; // zamknij plik return 0 ; 12 / 37
tekstowe binarne tekstowe zapis do pliku tekstowego Nale»y 1 U»y klasy ofstream do obsªugi strumienia wyj±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cout test25.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wyjsciowego i nazwij go alaout ofstream alaout (" ala. txt ") ; } alaout<<"w pliku :\ n" ; // zapisz do pliku cout<<" Na ekranie : " ; // wypisz na ekranie float x ; cin>>x ; alaout<<" Twoj tajny numer to "<< x <<endl ; alaout. close () ; // zamknij plik return 0 ; 13 / 37
tekstowe binarne tekstowe odczyt z pliku tekstowego Nale»y 1 U»y klasy ifstream do obsªugi strumienia wej±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cin test26.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wej±ciowego i nazwij go fin ifstream fin (" ala. txt ") ; cout<<" Oto zawarto± pliku "<<" ala. txt "<<" :\ n" ; char ch ; while ( fin. get ( ch )) // odczytaj znak z pliku i cout<<ch ; // wypisz go na ekranie cout<<" Gotowe \n" ; fin. close () ; } 14 / 37
tekstowe binarne tekstowe odczyt z pliku tekstowego Nale»y 1 U»y klasy ifstream do obsªugi strumienia wej±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cin test26.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wej±ciowego i nazwij go fin ifstream fin (" ala. txt ") ; cout<<" Oto zawarto± pliku "<<" ala. txt "<<" :\ n" ; char ch ; while ( fin. get ( ch )) // odczytaj znak z pliku i cout<<ch ; // wypisz go na ekranie cout<<" Gotowe \n" ; fin. close () ; } 15 / 37
tekstowe binarne tekstowe odczyt z pliku tekstowego Nale»y 1 U»y klasy ifstream do obsªugi strumienia wej±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cin test26.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wej±ciowego i nazwij go fin ifstream fin (" ala. txt ") ; cout<<" Oto zawarto± pliku "<<" ala. txt "<<" :\ n" ; char ch ; while ( fin. get ( ch )) // odczytaj znak z pliku i cout<<ch ; // wypisz go na ekranie cout<<" Gotowe \n" ; fin. close () ; } 16 / 37
tekstowe binarne tekstowe odczyt z pliku tekstowego Nale»y 1 U»y klasy ifstream do obsªugi strumienia wej±ciowego (utworzy obiekt) 2 Skojarzy ten obiekt z konkretnym plikiem 3 U»ywa tego obiektu jak cin test26.cpp # include < iostream > # include < fstream > using namespace std ; int main () { // utwórz dla pliku obiekt strumienia wej±ciowego i nazwij go fin ifstream fin (" ala. txt ") ; cout<<" Oto zawarto± pliku "<<" ala. txt "<<" :\ n" ; char ch ; while ( fin. get ( ch )) // odczytaj znak z pliku i cout<<ch ; // wypisz go na ekranie cout<<" Gotowe \n" ; fin. close () ; } 17 / 37
tekstowe binarne Klasa ifstream sªu»y do obsªugi wej±cia plikowego, klasa ofstream do obsªugi wyj±cia plikowego. Klasa fstream umo»liwia jednoczesne operacje wej±cia i wyj±cia plikowego. Wszystkie znajduj si w pliku nagªówkowym fstream i wywodz si one z klas zdeniowanych w pliku nagªówkowym iostream, a wi c ich obiekty mog korzysta z metod tych klas. 18 / 37
tekstowe binarne Klasa ifstream sªu»y do obsªugi wej±cia plikowego, klasa ofstream do obsªugi wyj±cia plikowego. Klasa fstream umo»liwia jednoczesne operacje wej±cia i wyj±cia plikowego. Wszystkie znajduj si w pliku nagªówkowym fstream i wywodz si one z klas zdeniowanych w pliku nagªówkowym iostream, a wi c ich obiekty mog korzysta z metod tych klas. 19 / 37
tekstowe binarne Nast puj ce operacje s równowa»ne ofstream do zapisu ofstream plikout ; plikout. open (" plik. txt ") ; lub ofstream plikout (" plik. txt ") ; istream do odczytu ifstream plikin ; plikin. open (" plik. txt ") ; lub ifstream plikin (" plik. txt ") ; 20 / 37
tekstowe binarne Nast puj ce operacje s równowa»ne ofstream do zapisu ofstream plikout ; plikout. open (" plik. txt ") ; lub ofstream plikout (" plik. txt ") ; istream do odczytu ifstream plikin ; plikin. open (" plik. txt ") ; lub ifstream plikin (" plik. txt ") ; 21 / 37
Kontrola strumienia plikowego tekstowe binarne Nale»y zawsze sprawdzi, czy plik zostaª prawidªowo otwarty. Po otwarciu pliku, ustawiane s agi, które informuj o tym, czy plik zostaª prawidªowo otworzony, czy nie. Funkcje, które umo»liwiaj sprawdzenie tej agi: 1 bool good(); 2 bool is_open(); danein. open (" dane. txt ") ; if (! danein. is_open ()) { // plik nie zostaª otwarty } 22 / 37
Kontrola strumienia plikowego tekstowe binarne Nale»y zawsze sprawdzi, czy plik zostaª prawidªowo otwarty. Po otwarciu pliku, ustawiane s agi, które informuj o tym, czy plik zostaª prawidªowo otworzony, czy nie. Funkcje, które umo»liwiaj sprawdzenie tej agi: 1 bool good(); 2 bool is_open(); danein. open (" dane. txt ") ; if (! danein. is_open ()) { // plik nie zostaª otwarty } 23 / 37
Kontrola strumienia plikowego tekstowe binarne Nale»y zawsze sprawdzi, czy plik zostaª prawidªowo otwarty. Po otwarciu pliku, ustawiane s agi, które informuj o tym, czy plik zostaª prawidªowo otworzony, czy nie. Funkcje, które umo»liwiaj sprawdzenie tej agi: 1 bool good(); 2 bool is_open(); danein. open (" dane. txt ") ; if (! danein. is_open ()) { // plik nie zostaª otwarty } 24 / 37
Funkcja eof tekstowe binarne Funkcja eof sªu»y do sprawdzania, czy wska¹nik pliku znajduje si na ko«cu pliku. Denicja funkcji: bool eof(); Funkcja zwróci warto± true wtedy, gdy nie b dzie ju» w pliku wi cej danych do odczytu. 25 / 37
tekstowe binarne tekstowe odczyt wierszami z pliku tekstowego test27.cpp # include < iostream > # include < fstream > # include < iomanip > // uzyjemy setw # include < string > // uzyjemy typu string using namespace std ; int main ( ) { fstream plik ; plik. open ( " C :\\ cwiczenia \\ dane. txt " ) ; if ( plik. good ( ) ) { int nr_wiersza=0 ; string wiersz ; while (! plik. eof ( ) ) { getline (plik, wiersz ) ; nr_wiersza ++ ; cout<<setw ( 3 )<<nr_wiersza<<" : "<<wiersz<<endl ; } cout<<" Liczba wierszy : "<<nr_wiersza<<endl ; } else cout<<" ERROR - Brak dostepu do pliku!\n \n" ; return 0 ; } 26 / 37
Tryby otwarcia pliku tekstowe binarne Staªe zdeniowane w klasie ios_base. Metoda open() mo»e posiada jeszcze jeden argument, który okre±la tryb otwarcia pliku. Staªa Znaczenie ios_base::in Otwórz plik do odczytu ios_base::out Otwórz plik do zapisu ios_base::ate Po otwarciu pliku ustaw si na jego ko«cu. Dane mog by dopisane w dowolnym miejscu ios_base::app Dopisz dane na koniec pliku ios_base::trunc Zredukuj rozmiar pliku do zera, je±li istnieje ios_base::binary Plik binarny Mo»na je ª czy za pomoc operatora bitowej alternatywy. ofstream fileout (" dane. txt ", ios_base :: out ios_base :: app ) ; lub ofstream fileout ; fileout. open (" dane. txt ", ios_base :: out ios_base :: app ) ; lub ofstream outfile (" plik ", ios_base :: out ios_base :: app ) ; 27 / 37
Tryby otwarcia pliku tekstowe binarne Staªe zdeniowane w klasie ios_base. Metoda open() mo»e posiada jeszcze jeden argument, który okre±la tryb otwarcia pliku. Staªa Znaczenie ios_base::in Otwórz plik do odczytu ios_base::out Otwórz plik do zapisu ios_base::ate Po otwarciu pliku ustaw si na jego ko«cu. Dane mog by dopisane w dowolnym miejscu ios_base::app Dopisz dane na koniec pliku ios_base::trunc Zredukuj rozmiar pliku do zera, je±li istnieje ios_base::binary Plik binarny Mo»na je ª czy za pomoc operatora bitowej alternatywy. ofstream fileout (" dane. txt ", ios_base :: out ios_base :: app ) ; lub ofstream fileout ; fileout. open (" dane. txt ", ios_base :: out ios_base :: app ) ; lub ofstream outfile (" plik ", ios_base :: out ios_base :: app ) ; 28 / 37
Tryby otwarcia pliku tekstowe binarne dla klasy ofstream domy±ln warto±ci jest: ios_base :: out ios_base :: trunc a dla klasy iostream : ios_base :: in 29 / 37
Tryby otwarcia pliku tekstowe binarne dla klasy ofstream domy±ln warto±ci jest: ios_base :: out ios_base :: trunc a dla klasy iostream : ios_base :: in 30 / 37
binarne tekstowe binarne Dane zawarte w pliku binarnym zawsze traktowane s jak ci g bajtów, bez wzgl du na rodzaj zapisanej w pliku informacji. Plik binarny otwieramy z atrybutem ios_base::binary. Do zapisu danych u»ywamy metody write() a do odczytu metody read(). 31 / 37
binarne tekstowe binarne Dane zawarte w pliku binarnym zawsze traktowane s jak ci g bajtów, bez wzgl du na rodzaj zapisanej w pliku informacji. Plik binarny otwieramy z atrybutem ios_base::binary. Do zapisu danych u»ywamy metody write() a do odczytu metody read(). 32 / 37
binarne tekstowe binarne write ( const char * bufor, int ilosc ) ; read ( const char * bufor, int ilosc ) ; Funkcje pobieraj dwa argumenty: adres pami ci, gdzie znajduje si warto± przeznaczona do zapisu (jest okre±lone miejsce w pami ci), argument ten musi by zrzutowany na wska¹nik na char rozmiar danych w bajtach odpowiadaj cy rozmiarowi zapisywanej warto±ci). 33 / 37
binarne tekstowe binarne write ( const char * bufor, int ilosc ) ; read ( const char * bufor, int ilosc ) ; Funkcje pobieraj dwa argumenty: adres pami ci, gdzie znajduje si warto± przeznaczona do zapisu (jest okre±lone miejsce w pami ci), argument ten musi by zrzutowany na wska¹nik na char rozmiar danych w bajtach odpowiadaj cy rozmiarowi zapisywanej warto±ci). 34 / 37
binarne zapis tekstowe binarne test28.cpp # include < iostream > # include < fstream > using namespace std ; int main () { ofstream exampleout (" example. bin ", ios :: binary ) ; int liczba = 30 ; exampleout. write (( char *)(& liczba ), sizeof ( liczba )) ; float x=7. 76 ; for ( int i=1 ; i <10 ; i++ ) { x=i*x ; exampleout. write (( char *)(&x), sizeof (x)) ; } exampleout. close () ; return 0 ; } 35 / 37
binarne odczyt tekstowe binarne test29.cpp # include < iostream > # include < fstream > using namespace std ; int main () { int liczba ; float x ; ifstream examplein (" example. bin ", ios :: binary ) ; examplein. read (( char *)(& liczba ), sizeof ( liczba )) ; cout<<liczba<<endl ; for ( int i=1 ; i <10 ; i++ ) { examplein. read (( char *)(&x), sizeof (x)) ; cout<<x<<endl ; } cout<<" koniec "<<endl ; return 0 ; } 36 / 37
tekstowe binarne Dzi kuj za uwag!!! 37 / 37