Operacje na pami eci i odrobina I/O Zak lad Chemii Teoretycznej UJ 8 stycznia 2007
Funkcje operujace Wstep do operacji I/O na plikach 1 Operacje na pami eci 2 Funkcje operujace 3 Wst
Funkcje operujace Wst malloc, free, sizeof Funkcja malloc alokuje pamieć o rozmiarze size i zwraca wskaźnik do poczatku obszaru zaalokowanej pamieci. Pamieć pobrana przy pomocy malloc jest zajeta aż do chwili jej zwrócenia przez wywo lanie funkcji free. #i n c l u d e <s t d i o. h> #i n c l u d e < s t d l i b. h> /* v o i d * m a l l o c ( s i z e t NBYTES ) ; v o i d f r e e ( v o i d *APTR ) ; */ i n t main ( ) { i n t n ; s c a n f ( %d, &n ) ; double *a = m a l l o c ( n * s i z e o f ( double ) ) ; i f ( n > 3) { *( a + 3) = 2. 0 ; a [ 1 ] = 1. 0 ; p r i n t f ( %f %f \n, a [ 1 ], a [ 3 ] ) ; f r e e ( a ) ; r e t u r n 0 ;
Funkcje operujace Wstep do operacji I/O na plikach memset #i n c l u d e <s t d i o. h> #i n c l u d e < s t r i n g. h> /* void *memset ( const void *DST, i n t C, s i z e t LENGTH ) ; Funkcja konwertuje argument C do typu unsigned char (1 bajtowy ) i w y p e l n i a LENGTH bajtow p a m i e c i t a w a r t o s c i a z a c z y n a j a c od a d r e s u wskazywanego p r z e z DST */ i n t main ( ) { double a [ 5 ] = {1, 2, 4, 5, 9 ; f o r ( unsigned i = 0 ; i < 5 ; ++i ) p r i n t f ( a[%d ] = %f \n, i, a [ i ] ) ; memset ( a, 0, 5 * s i z e o f ( double ) ) ; f o r ( unsigned i = 0 ; i < 5 ; ++i ) p r i n t f ( a[%d ] = %f \n, i, a [ i ] ) ; r e t u r n 0 ;
Funkcje operujace Wst calloc, realloc #i n c l u d e < s t d l i b. h> /* v o i d * c a l l o c ( s i z e t N, s i z e t S ) ; zwraca wskaznik do p r z y d z i e l o n e g o bloku pamieci : takiego, ktory pomiesci N elementow, kazdy o rozmiarze S ; kazdy bajt zwracanego obszaru pamieci j e s t ustawiany na 0 */ v o i d * r e a l l o c ( v o i d *PTR, s i z e t NBYTES ) ; J e z e l i PTR j e s t wskaznikiem na w c z e s n i e j p r z y d z i e l o n a dynamicznie pamiec, to r e a l l o c pozwala zmienic wielkosc przydzielonego obszaru na NBYTES, nie zmieniajac jego poczatkowej zawartosci. i n t main ( ) { double *a = c a l l o c ( 5, s i z e o f ( double ) ) ; /* dokladnie rownowazne sekwencji : malloc, memset */ double *b = m a l l o c (5 * s i z e o f ( double ) ) ; memset ( b, 0, 5 * s i z e o f ( double ) ) ; r e a l l o c ( a, 3 * s i z e o f ( double ) ) ; // zmniejszamy do t r z e c h r e a l l o c ( a, 7 * s i z e o f ( double ) ) ; // zwiekszamy do s i e d m i u r e t u r n 0 ;
Funkcje operujace Wst memcpy, memmove #i n c l u d e <s t d i o. h> #i n c l u d e < s t r i n g. h> /* void *memcpy ( void *OUT, const void *IN, s i z e t N ) ; void *memmove( void *OUT, const void *IN, s i z e t N ) ; memcpy k o p i u j e N bajtow z o b s z a r u p a m i e c i wskazywanego p r z e z IN do o b s z a r u wskazywanego p r z e z OUT, o b s z a r y IN i OUT nie powinny s i e nakladac ; memmove pozwala o b s l u z y c poprawnie k o p i o w a n i e w przypadku nakladajacych s i e obszarow IN i OUT; */ i n t main ( ) { double a [ 5 ] = {1, 2, 4, 5, 9 ; f o r ( unsigned i = 0 ; i < 5 ; ++i ) p r i n t f ( a[%d ] = %f \n, i, a [ i ] ) ; memcpy ( a + 3, a, 2 * s i z e o f ( double ) ) ; f o r ( unsigned i = 0 ; i < 5 ; ++i ) p r i n t f ( a[%d ] = %f \n, i, a [ i ] ) ; memmove( a + 1, a, 2 * s i z e o f ( double ) ) ; f o r ( unsigned i = 0 ; i < 5 ; ++i ) p r i n t f ( a[%d ] = %f \n, i, a [ i ] ) ; r e t u r n 0 ;
Funkcje operujace Wst stdin, stdout, stderr Podstawowym pojeciem dla operacji wejścia/wyjścia jest strumień. Stanowi on źród lo lub cel danych. Strumień wiaże sie z plikiem lub urzadzeniem za pomoca otwarcia, po l aczenie to zrywa sie za pomoca zamkniecia. W momencie uruchomienia programu dysponuje on szczególnymi trzema strumieniami, które sa już otwarte: stdin - standardowe wejście stdout - standardowe wyjście stderr - standardowe wyjście b l edów
Funkcje operujace Wst getchar, putchar #i n c l u d e <s t d i o. h> /* i n t g e t c h a r ( v o i d ) ; i n t p u t c h a r ( i n t ) ; */ getchar zwraca znak pobrany ze standardowego wejscia, efektem ubocznym j e s t p r z e s u n i e c i e s i e w tym s t r u m i e n i u na n a s t e p n a p o z y c j e ; putchar wypisuje otrzymany znak na standardowe wyjscie, efektem ubocznym j e s t p r z e s u n i e c i e s i e w tym s t r u m i e n i u na n a s t e p n a p o z y c j e, w a r t o s c zwracana p r z e z p u t c h a r to otrzymany argument ( s u k c e s ) l u b EOF ( b l a d ) ; i n t main ( ) { i n t c ; c = g e t c h a r ( ) ; w h i l e ( c!= EOF) { p u t c h a r ( c ) ; c = g e t c h a r ( ) ; r e t u r n 0 ;
Funkcje operujace Wst printf, scanf #i n c l u d e <s t d i o. h> i n t p r i n t f ( c o n s t char *format,... ) ; i n t s c a n f ( c o n s t char *format,... ) ; /* p r i n t f pod nadzorem argumentu format przeksztalca, f o r m a t u j e i w y p i s u j e s w o j e k o l e j n e argumenty na standardowe w y j s c i e ; scanf wczytuje znaki ze standardowego wejścia, i n t e r p r e t u j e j e z g o d n i e ze s p e c y f i k a c j a zawarta w argumencie format i z a p a m i e t u j e w y n i k i w miejscach określonych przez k o l e j n e argumenty. */ Format zawiera: zwyk le znaki specyfikacje przekszta lceń - rozpoczynajace sie od % i kończace znakiem przekszta lcenia Zapraszam do lektury. Przyk lady, korekta do [BK, DR] i dyskusja - w czwartek.
Funkcje operujace Wstep do operacji I/O na plikach sprintf i n t s p r i n t f ( char *s, c o n s t char *format,... ) ; dzia la tak samo jak printf, przy czym rol e wyjścia spe lnia tablica s na końcu wyniku dodawany jest znak pusty tablica s musi być dostatecznie duża, żeby pomieścić wynik wartość zwracana (liczba wypisanych znaków) nie uwzgl ednia końcowego znaku pustego
Funkcje operujace Wstep do operacji I/O na plikach sscanf i n t s s c a n f ( char *s, c o n s t char *format,... ) ; dzia la tak samo jak sscanf rol e wejścia pe lni tablica s
Funkcje operujace Wstep do operacji I/O na plikach fopen FILE *fopen ( c o n s t char * f i l e, c o n s t char *mode ) ; Funkcja fopen otwiera (zwiazuje ze strumieniem) plik o nazwie file. Funkcja otwiera plik w trybie mode i zwraca wskaźnik do pliku (typu FILE*) lub w przypadku b l edu wskaźnik NULL. Otrzymany wskaźnik do pliku może być później użyty jako argument w funkcjach wykonujacych operacje wejścia/wyjścia.
Funkcje operujace Wst Na jakie sposoby można otworzyć plik? Możliwe tryby otwarcia to: r - czytanie, plik musi istnieć w - pisanie, jeśli plik istnieje to zostanie nadpisany; jeśli nie, to utworzony a - dopisywanie, poprzednia zawartość jest zachowywana; jeśli plik nie istnieje, to zostanie utworzony przy otwieraniu plików binarnych należy do lożyć b - np. wb #i n c l u d e <s t d i o. h> i n t main ( ) { FILE* ostream = fopen ( mojplik. dat, w ) ; putc ( a, ostream ) ; // w y p i s u j e znak a do p l i k u f c l o s e ( ostream ) ; // zamyka p l i k r e t u r n 0 ;
Funkcje operujace Wstep do operacji I/O na plikach fclose i n t f c l o s e ( FILE * stream ) ; zamyka plik, czyli zrywa jego po l aczenie ze strumieniem zwraca 0 (sukces) lub EOF (b l ad) wskaźnik do pliku zostaje zwolniony - istotne dla systemów z ograniczeniami na liczbe otwartych plików efektem ubocznym jest opróżnienie buforów wejściowych po l aczone z wypisaniem nie wypisanych dotad danych zwiazanych ze strumieniem
Funkcje operujace Wst stdin/stdout/stderr raz jeszcze stdin, stdout, stderr też sa typu FILE* (sa wskaźnikami do plików) można ich użyć przy wywo laniu dowolnej funkcji przyjmujacej argument typu FILE* #i n c l u d e <s t d i o. h> i n t main ( ) { i n t l i c z b a ; FILE* ostream = fopen ( moj plik. dat, w ) ; s c a n f ( %d, &l i c z b a ) ; f p r i n t f ( ostream, Ala ma %d koty, l i c z b a ) ; f p r i n t f ( s t d o u t, Ala ma %d koty, l i c z b a ) ; f c l o s e ( s t d o u t ) ; // to t e z mozna z r o b i c f c l o s e ( ostream ) ;
Funkcje operujace Wst fprintf, fscanf i n t f p r i n t f ( FILE* stream, c o n s t char *format,... ) ; i n t f s c a n f ( FILE* stream, c o n s t char *format,... ) ; dzia laj a jak printf i scanf strumień na którym operuja jest definiowany przez wskaźnik stream (wskaźnik do pliku) fprintf(stdout,...) odpowiada printf(...) fscanf(stdin,...) odpowiada scanf(...)
Funkcje operujace Wst getc, putc, ungetc i n t g e t c ( FILE * stream ) ; i n t putc ( i n t c, FILE * stream ) ; i n t ungetc ( i n t c, FILE * stream ) ; getc i putc dzia laj a odpowiednio jak getchar i putchar strumień na którym operuja jest definiowany przez wskaźnik stream (wskaźnik do pliku) ungetc pozwala wycofać znak c do strumienia stream - zostanie on pobrany przy nast epnym odczycie ze strumienia dla danego strumienia wycofać można tylko jeden znak nie można wycofać znacznika końca pliku(eof)