Zapis,Odczyt Pliku w c++

Embed Size (px)

Citation preview

Przechowywanie danych czyli pliki w jezyku C++ mgr inz. Piotr [email protected]

Politechnika Pozna ska, Instytut Automatyki i Inzynierii Informatycznej n

Przechowywanie danych czyli pliki w j zyku C++ p. 1/4 e

Plik a kaseta magnetofonowa

Plik su y do przechowywania danych na dysku lub z innym no niku. s Ma okre lony poczatek i koniec s Dane uo one sa jedna po drugiej z Odczyt pliku realizowany jest tak jak odczyt kasety magnetofonowej (odtworzenie pewnego fragmentu powoduje przewiniecie kasety) a tym samym ponowne odtworzenie spowoduje przeczytanie/odtworzenie nowego fragmentu,

Przechowywanie danych czyli pliki w j zyku C++ p. 2/4 e

Plik a kaseta magnetofonowa cd...

W pliku, w odr nieniu od tablicy zapisujac dane nie z okre la sie ich poo enia (zostana one po prostu s z dograne). W operacjach zapisu/odczytu okre la sie s wyacznie ilo c danych do zapisu/ odczytu s Aby odczyta pewien fragment pliku nale y najpierw c z ustawi marker aktualnego poo enia na poczatek c z fragmentu ktry chcemy przeczyta /zapisa a c c nastepnie odczyta (read) lub zapisa (write) dane c c ktre nas interesuja.

Przechowywanie danych czyli pliki w j zyku C++ p. 3/4 e

Pliki tekstowe vs binarne

Brak r nicy dla tekstu z istnieja istotne r nice w formie przechowywania liczb z zale ne od sposobu kodowania z W plikach binarnych poo enie kolejnej danej z okre lane jest na podstawie rozmiaru poprzedniej s W plikach tekstowych dane rozdzielone sa znakami przecinkami, srednikami, spacjami, tabulatorami itp.

Przechowywanie danych czyli pliki w j zyku C++ p. 4/4 e

Reprezentacja liczb w pliku tekstowym

Przechowa liczby: 12345,128,12346 c 1 = 49 = 0x31 (w ASCII) 2 = 50 = 0x32 (w ASCII) ... , = 44 = 0x2C (w ASCII) ...

Przechowywanie danych czyli pliki w j zyku C++ p. 5/4 e

Reprezentacja liczb w pliku binarnym

Przechowa liczby: 12345,128,12346 c 12345 = 0x3039 128 = 0x0080 12346 = 0x303A

Przechowywanie danych czyli pliki w j zyku C++ p. 6/4 e

Dostep do pliku

Trzy kroki ktre musza zosta wykonane przy c dostepie do pliku: 1. Otworzy plik c 2. Odczyt lub/i zapis 3. Zamkna plik c Przy tradycyjnym sposobie obsugi plikw krok 1 i 3 sa takie same niezale nie od tego czy mamy do z czynienia z plikiem tektowym czy binarnym

Przechowywanie danych czyli pliki w j zyku C++ p. 7/4 e

Otwarcie pliku - fopen

1. Zadeklarowa wska nik do pliku handler c z 2. Wywoa funkcje fopen() Funkcja przekazuje c wska nik do otwartego strumienia pliku. z Przykad:FILE s t r u m i e n ; s t r u m i e n = fopen ( P l i k . t x t , w t ) ;

Przechowywanie danych czyli pliki w j zyku C++ p. 8/4 e

Otwieranie pliku - argumenty (1)

fopen(arg1, arg2 z e arg1- Nazwa pliku zawierajaca nazwe i ew. scie k dostepu: c:\\ mojkatalog\\ Plik.txt. Nazwa ta mo e z zosta podana bezpo rednio lub przez zmienna c s przechowujaca tablice znakw np tt char[.]

Przechowywanie danych czyli pliki w j zyku C++ p. 9/4 e

Otwieranie pliku - argumenty (2)

fopen(arg1, arg2) arg2 - tryb dostepu: wt Otwarcie pliku ASCII do zapisu (plik jest tworzony od nowa), rt Otwarcie pliku ASCII do odczytu, at Otwarcie pliku ASCII do doaczenia (zapisu na koncu pliku) wb, rb, ab Jak wy ej tylko dla plikw binarnych z

Przechowywanie danych czyli pliki w j zyku C++ p. 10/4 e

Otwieranie pliku - argumenty (3)

Ponadto r+t, r+b otwarcie pliku do zapisu i odczytu (strumien jest ustawiany na poczatku pliku w+t, w+b plik jest tworzony od nowa (je li istnieje to s czyszczony i otwierany do odczytu i zapisu a+t, a+b Tak samo jak dla r+ z tym, ze strumien ustawiany jest na koncu

Przechowywanie danych czyli pliki w j zyku C++ p. 11/4 e

Dostep do pliku binarnego

Zapis/odczyt realizowany jest za pomoca funkcji fwrite,fread. Funkcje dokonuja zapisu/odczytu wyspecykowanej ilo ci bajtw poczawszy od aktualnej s pozycji w strumieniu. Funkcie fread i fwrite maja taka sama liste argumentw: fwrite(void * buffer, long size, long count, FILE * stream ); buffer - adres poczatku pamieci spod ktrej kopiowane/zapisywane beda dane size - rozmiar pojedynczego bloku pamieci (elementu) count - ilo c elementw do skopiowania s stream - wska nik do strumienia pliku z

Przechowywanie danych czyli pliki w j zyku C++ p. 12/4 e

Dostep do pliku binarnego

Przykad:FILE s t r u m i e n ; s t r u m i e n = fopen ( P l i k _ b i n . b i n , w+ b ) ; i n t zmienna1 =5; long zmienna2 =8; long zmienna3=0xCCCCCC; i n t tab [ ] = { 1 0 , 1 6 , 8 , 1 } ; char n a p i s [ ] = " zwykly t e k s t " ; f w r i t e (& zmienna1 , s i z e o f ( i n t ) , 1 , s t r u m i e n ) ; f w r i t e (& zmienna2 , s i z e o f ( long ) , 1 , s t r u m i e n ) ; f w r i t e (& zmienna3 , s i z e o f ( long ) , 1 , s t r u m i e n ) ; f w r i t e (& tab , s i z e o f ( i n t ) , 4 , s t r u m i e n ) ; f c l o s e ( strumien ) ; / / zapis t a b l i c y f w r i t e ( napis , s i z e o f ( char ) , s t r l e n ( n a p i s ) , s t r u m i e n ) ;

Przechowywanie danych czyli pliki w j zyku C++ p. 13/4 e

Przemieszczanie w pliku

Aktualne poozenie w pliku:FILE s t r u m i e n ; s t r u m i e n = fopen ( P l i k _ b i n . b i n , w+ b ) ; i n t pos= f t e l l ( s t r u m i e n ) ;

przesuniecie poozenia w strumieniu do pozycji wzgledem poczatku, aktualnej pozycji lub konca strumienia:f s e e k ( strumien , o f f s e t , s e e k _ d i r ) ; np : f s e e k ( strumien , 1 0 0 ,SEEK_SET ) ;

Przechowywanie danych czyli pliki w j zyku C++ p. 14/4 e

Przemieszczanie w pliku

gdzie seek dir mo e wynosi : z c SEEK_SET - poo enie wzgledem poczatku pliku z SEEK_CURR - poo enie wzgledem aktualnego z poo enia z SEEK_END - poo enie wzgledem konca pliku z

Przechowywanie danych czyli pliki w j zyku C++ p. 15/4 e

Obsuga plikw tekstowych - zapis

Do obsugi plikw stosuje sie funkcje analogiczne jak printf i scanf, z tym, ze zawieraja one wska nik do strumienia, z z ktrego dane beda odczytywane czy te zapisywane. zFILE s t r u m i e n ; s t r u m i e n = fopen ( P l i k _ t x t . t x t , w+ t ) ; i n t z1 =5; long z2 =8; long z3=0xCCCCCC; char n a p i s [ ] = " zwykly t e k s t " ; p r i n t f ( "%d , %l d , %l d , %s " , z1 , z2 , z3 , n a p i s ) ; \ \ w y s w i e t l a dane na e k r a n i e f p r i n t f ( strumien , "%d , %l d , %l d , %s " , z1 , z2 , z3 , n a p i s ) ; \ \ z a p i s u j e dane do p l i k u t a k samo j a k na e k r a n i e f c l o s e ( strumien ) ;

Przechowywanie danych czyli pliki w j zyku C++ p. 16/4 e

Obsuga plikw tekstowych - zapis

Funkcje prinf(.) i fprinf(.) umo liwiaja z ustawienie minimalnej szeroko ci pola oraz precyzji (ilo ci s s miejsc po przecinku) w wy wietlaniu liczb s zmiennoprzecinkowych:f l o a t l i c z b a =1.5673892; p r i n t f ( "%f \ n " , l i c z b a ) ; / / w y s w i e t l a l i c z b e z domy s lnymi u s t a w i e n i a m i p r i n t f ( "%f 1 0 . 3 \ n " , l i c z b a ) ; p r i n t f ( "%f 1 0 . 4 \ n " , l i c z b a ) ; / / w y s w i e t l a l i c z b e na p o l u 10znakowym z d o k a d n o s c i a do 3 m i e j s c po p r z e c i n k u wynik : 1.56738 1.567 1.5673

Przechowywanie danych czyli pliki w j zyku C++ p. 17/4 e

Odczyt danych z pliku tekstowego (1)

Za my ze mamy nastepujacy plik: z 1 ,1.1 2 ,14.3 6 ,12.8

zawiera on w ka dej linii dwie liczby: cakowita oraz z zmiennoprzecinkowa. Do wy wietlenia pojedynczej linii na s ekranie su y wiec wzorzec: z "%d,%f" Ten sam wzorzec stosuje sie do odczytu przy wykorzystaniu funkcji scanf(.)

Przechowywanie danych czyli pliki w j zyku C++ p. 18/4 e

Odczyt danych z pliku tekstowego(2)

FILE s t r u m i e n ; int liczba1 ; float liczba2 ; s t r u m i e n = fopen ( D a n e _ t x t . t x t , r + t ) ; f s c a n f ( strumien , " \%d ,\% f " ,& l i c z b a 1 ,& l i c z b a 2 ) ; \ \ odczyt pierwszej l i n i i f s c a n f ( strumien , " \%d ,\% f " ,& l i c z b a 1 ,& l i c z b a 2 ) ; \ \ odczyt d r u g i e j ... f c l o s e ( strumien ) ; linii

Przechowywanie danych czyli pliki w j zyku C++ p. 19/4 e

Wykorzystanie strumieni (1)

1. Tworzony jest strumien 2. Strumien dowiazywany jest do pliku 3. zapis i odczyt z pliku odbywa sie za pomoca operatorw , 4. strumien jest zamykany

Przechowywanie danych czyli pliki w j zyku C++ p. 20/4 e

Wykorzystanie strumieni (2)

Dostep do pliku tekstowego jest rwnie mo liwy z z analogicznie jak dla cin i cout. Dla czytania i zapisu z pliku wykorzystuje sie strumien typu fstreamf s t r e a m s t r u m i e n _ p l i k u ( " nazwa_pliku " , t r y b ) ;

Tryb okre la czy plik bedzie otwierany do zapisu i odczytu: s ios::in - otwarcie do odczytu ios::out - otwarcie do zapisu ios::app - otwarcie do zapisu na koncu istniejacego pliku ios::in|ios::out - otwarcie do zapisu i odczytu

Przechowywanie danych czyli pliki w j zyku C++ p. 21/4 e

Wykorzystanie strumieni (2)

fstream strumien ( " p l i k _ s t r . t x t " , ios : : out ) ; i n t z1 =5; long z2 =8; long z3=0xCCCCCC; char n a p i s [ ] = " zwykly t e k s t " ; / / zapis strumien