Zapis spotkania inaugurującego prace nad powstaniem Strategii ...
Zapis,Odczyt Pliku w c++
-
Upload
artistofphat -
Category
Documents
-
view
146 -
download
0
Transcript of Zapis,Odczyt Pliku w c++
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