Professional Documents
Culture Documents
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,
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.
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.
Przechowa liczby: 12345,128,12346 c 1 = 49 = 0x31 (w ASCII) 2 = 50 = 0x32 (w ASCII) ... , = 44 = 0x2C (w ASCII) ...
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
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 ) ;
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[.]
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
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
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
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 ) ;
Przemieszczanie w pliku
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 ) ;
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
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. z
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 . 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 ) ;
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
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(.)
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
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
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 fstream
f 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
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 <<z1<< " , " <<z2<< " , " <<z3<< " , " << n a p i s ; strumien . close ( ) ; / / zamkniecie s t r u m i e n i a
Manipulatory umo liwiaja modykowanie sposobu z wy wietlania danych: s Zmiana formatu wyswietlania: hex - wy wietlanie liczby w formie szesnastkowej s oct - wy wietlanie liczby w formie semkowej s dec - wy wietlanie liczby w formie dziesietnej s
i n t z1 =193; strumien <<z1<< " , " <<hex<<z1<< " , " <<oct <<z1 ;
Precyzja
f l o a t a =10.56789; strumien << s e t p r e c i s i o n (3) < <a ; / / u s t a w i a nowa p r e c y z j e w y s w i e t l a n i a
Szeroko c pola s
i n t z1 =67; strumien << ( <<setw (10) < <a<< ) << e n d l ; / / umieszcza a w p o l u 10 znakowym
Pozycja w strumieniu
Aby uzyska dostep do okre lonej danej znajdujacej sie c s wewnatrz pliku, bez konieczno ci czytania wszystkich s elementw poprzedzajacych, nalezy ustawi poozenie w c strumieniu na miejsce w ktrym sie ona znajduje: Uzyskanie informacji o aktualnym poozeniu:
i n t pos= s t r u m i e n . t e l l p ( ) ;
Pozycja w strumieniu
przesuniecie poozenia w strumieniu do pozycji wzgledem poczatku, aktualnej pozycji lub konca strumienia:
s t r u m i e n . seekp ( 1 0 0 , s e e k _ d i r ) ; ko nca l u b p o z y c j i a k t u a l n e j
gdzie seek dir mo e wynosi : z c ios::beg - poo enie wzgledem poczatku pliku z ios::cur - poo enie wzgledem aktualnego z poo enia z ios::end - poo enie wzgledem konca pliku z